[DOCKER] Jusqu'au déploiement en production de hello-app avec k3d sur Time4VPS

Qu'est-ce que k3d?

Une version allégée de Kubernetes appelée k3s publiée par Rancher C'est un substitut qui construit un cluster à l'aide de docker. Pour ceux qui ont déjà opéré avec docker-compose sur VPS Je pense que c'est un outil qui peut être une alternative.

Flux global

introduction

Cette fois, parce que c'est un test, c'est le plus proche possible Nous allons construire un cluster en utilisant k3d. Le serveur adopte le VPS Time4VPS le plus puissant à l'étranger, Vous pouvez obtenir un domaine gratuit Je l'obtiendrai avec freenom. Pour l'image du conteneur Docker, utilisez this guy.

Préparer le serveur Time4VPS

Tout d'abord, préparez un serveur vps à partir de ici. Au fait, le type de système d'exploitation utilisé dans cet article est ʻUbuntu 18.04`. Après avoir terminé le contrat vps, reportez-vous à l'article ci-dessous et définissez les paramètres initiaux pour Ubuntu. Paramètres initiaux minimum d'Ubuntu

Installez k3d sur Time4VPS

Bien sûr, k3d nécessite docker, alors installez d'abord docker. Si vous souhaitez installer docker sur Ubuntu, il est recommandé de se référer à cet article. Installer Docker sur Ubuntu 18.04 (également + docker-compose)

Après avoir installé le docker, faites Install k3d.

curl -s https://raw.githubusercontent.com/rancher/k3d/main/install.sh | bash

Construire un cluster avec k3d

Il est maintenant temps de configurer un cluster avec k3d. Pour <your vps global ip>, appliquez l'ip vps que vous avez préparé.

k3d cluster create hoge-cluster --agents 2 --api-port <your vps global ip>:6550 -p 80:80@agent[0] -p 443:443@agent[0]

Connectez-vous avec kubectl local

Tout d'abord, exécutez ce qui suit côté serveur et notez les données de l'autorité de certification et le mot de passe de l'utilisateur.

vi ~/.kube/config

Ajoutez les informations de cluster, le contexte et l'utilisateur créés cette fois dans le fichier local ~ / .kube / config. Cela connectera le kubectl local au cluster sur Time4VPS

~/.kube/config(local)


apiVersion: v1
kind: Config
current-context: hoge-cluster
preferences: {}

clusters:
  - name: hoge-cluster
    cluster:
      certificate-authority-data: <your certificate-authority-data in vps ~/.kube/config>
      server: https://<your vps global ip>:6550

users:
  - name: admin@hoge-cluster
    user:
      password: <your password in vps ~/.kube/config>
      username: admin

contexts:
  - name: hoge-cluster
    context:
      cluster: hoge-cluster
      user: admin@hoge-cluster

*** Vérifiez si vous pouvez vous connecter au cluster ***

kubectl get node

NAME                        STATUS   ROLES    AGE   VERSION
k3d-hoge-cluster-agent-0    Ready    <none>   39m   v1.18.8+k3s1
k3d-hoge-cluster-agent-1    Ready    <none>   39m   v1.18.8+k3s1
k3d-hoge-cluster-server-0   Ready    master   39m   v1.18.8+k3s1

Installez cert-manager sur le cluster

Installez ensuite cert-manager sur le cluster pour fournir le service via SSL. L'installation de cert-manager est super facile car l'installation est terminée avec un seul manifeste. Installer cert-manager

Obtenez un domaine gratuit avec freenom

Je ne pense pas que ce soit un gaspillage pour obtenir un domaine payant simplement en l'essayant dans un test. Il est donc pratique d'obtenir un domaine gratuit appelé freenom Utilisez le service. Le nom de domaine à acquérir est cette fois «k3d-hello-app.tk».

Écrire et déployer le fichier manifeste

Enfin, écrivez le fichier manifeste et déployez-le. Cette fois, l'image du conteneur utilise le registre publié par google comme exemple pour GKE. C'est une tâche solitaire car il n'y a pas de travail de création d'image ou de travail de poussée vers le registre distant. Préparez un répertoire pour gérer le manifeste appelé k8s Préparons deux types de fichiers manifestes.

#La structure du répertoire ressemble à ceci
.
└── k8s
    ├── hello-app.yaml
    └── ingress.yaml

k8s/hello-app.yaml



apiVersion: v1
kind: Service
metadata:
  name: hello-app-service
spec:
  type: LoadBalancer
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 8080
  selector:
    app: hello-app

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: hello-app-deployment
spec:
  replicas: 6
  selector:
    matchLabels:
      app: hello-app
  template:
    metadata:
      labels:
        app: hello-app
        env: stage
    spec:
      containers:
        - image: gcr.io/google-samples/hello-app:1.0
          name: hello-app
          ports:
            - containerPort: 8080

Au fait, le type de service est Load Balancer k3d peut utiliser type: LoadBalancer.

Ensuite, écrivez un fichier manifeste pour l'entrée. Remplacez «» par votre propre adresse e-mail.

k8s/ingress.yaml


apiVersion: cert-manager.io/v1
kind: Issuer
metadata:
  name: letsencrypt-issuer
spec:
  acme:
    # The ACME server URL
    server: https://acme-v02.api.letsencrypt.org/directory
    # Email address used for ACME registration, update to your own.
    email: <your mail address>
    # Name of a secret used to store the ACME account private key
    privateKeySecretRef:
      name: letsencrypt-issuer
    solvers:
      - http01:
          ingress:
            class: traefik
---
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
  name: letsencrypt-cert
spec:
  dnsNames:
    - k3d-hello-app.tk

  secretName: letsencrypt-cert-tls
  issuerRef:
    name: letsencrypt-issuer


---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: hoge-cluster-ingress
  annotations:
    ingress.kubernetes.io/ssl-redirect: "true"
    kubernetes.io/ingress.class: "traefik"
    certmanager.k8s.io/issuer: "letsencrypt-issuer"
    certmanager.k8s.io/acme-challenge-type: http01
spec:
  tls:
    - secretName: letsencrypt-cert-tls
      hosts:
        - k3d-hello-app.tk

  rules:
    - host: k3d-hello-app.tk
      http:
        paths:
          - path: /
            backend:
              serviceName: hello-app-service
              servicePort: 8080

Maintenant, appliquons le manifeste.

kubectl apply -f k8s -R

Au fait, je n'ai pas besoin du drapeau -R cette fois. Si le contenu du fichier manifeste devenait énorme. Quand il s'agit de quelque chose Je pense qu'il sera nécessaire de diviser le fichier manifeste en packages. Dans un tel cas, si vous ajoutez l'indicateur -R, le manifeste qui est divisé en packages sera également Si vous l'appliquez de manière récursive, c'est ce que c'est.


#Par exemple, une division de colis comme celle-ci
.
└── k8s
    ├── hello-app.yaml
    └── ingress
        ├── certificate.yaml
        ├── ingress.yaml
        └── issuer.yaml

Une fois le manifeste appliqué, vérifiez-le dans votre navigateur. S'il est affiché comme ci-dessous et que la conversion SSL est possible, c'est terminé!

Capture d'écran 2020-10-02 19.26.18.png

Sommaire

k3d configure un nœud virtuel dans un serveur physique Puisque nous construisons un cluster, il n'y a aucune disponibilité au niveau du serveur physique. Si un serveur est en pause, c'est fou! Et le tout Les services fonctionnant dans ce cluster seront suspendus. Le soi-disant rayon de souffle n'est pas un gros problème. C'est déjà un coup mortel d'un seul coup ww Ainsi, selon la taille de votre entreprise, il se peut qu'elle ne réponde pas du tout à vos exigences. Lorsque vous vous concentrez sur la réduction des coûts de fonctionnement tels que l'échelle personnelle N'y a-t-il pas un cluster virtuel comme k3d? En particulier, j'ai personnellement utilisé docker-compose pour la production! Il est fortement recommandé pour ceux qui aiment.

référence

Recommended Posts

Jusqu'au déploiement en production de hello-app avec k3d sur Time4VPS
Remarque sur le chemin de request.getRequestDispatcher
Programmation avec ruby (en route)
Changez le niveau de déploiement des documents API avec le plugin Gradle Swagger Generator
Samshin sur la valeur du champ caché
Retour sur les bases de Java
À propos du traitement de BigDecimal (avec réflexion)
Mettre en forme le contenu de LocalDate avec DateTimeFormatter
Jugement vrai / faux basé sur la condition de chaque différence avec plusieurs entiers
Une note rapide sur l'utilisation de jshell avec l'image Docker officielle du JDK