Lorsque je travaillais avec Kubernetes, j'ai créé le conteneur connecté par le navigateur car je me demandais sur quel Worker il fonctionnait. Je l'utilise pour arrêter le travailleur exprès et vérifier la destination de la connexion.
Il a été téléchargé sur https://hub.docker.com/r/yasthon/nginx-display-hostname.
Ici, il est exécuté dans l'environnement du nom d'hôte "dockerhost.example.jp".
$ docker pull yasthon/nginx-display-hostname
$ docker container run -d -v /etc/hostname:/usr/share/nginx/html/hostname -p 80:80 yasthon/nginx-display-hostname
$ curl http://localhost/index.sh
<html><head>
<title>dockerhost.example.jp</title>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
</head><body>
HOSTNAME : dockerhost.example.jp
</body></html>
Vérifiez également à partir du navigateur.
//[Adresse IP de l'hôte Docker]/index.Accéder à sh.
HOSTNAME : dockerhost.example.jp
## mouvement
 Je monte `` / etc / hostname '' au démarrage du conteneur.
 J'exécute sh de Nginx et lis le nom d'hôte.
 Dockerfile
 Ce fichier est utilisé lors de la construction locale.
#### **`Dockerfile`**
```dockerfile
FROM debian:buster-slim
COPY default.conf /etc/nginx/conf.d/
COPY index.sh /usr/share/nginx/html/
RUN apt-get update && \
  apt-get install -y --no-install-recommends nginx fcgiwrap && \
  apt-get autoclean && \
  rm -rf /var/lib/apt/lists/* && \
  echo "daemon off;" >> /etc/nginx/nginx.conf && \
  rm -f /etc/nginx/sites-enabled/default && \
  chmod 744 /usr/share/nginx/html/index.sh && \
  chown www-data:www-data /usr/share/nginx/html/index.sh
CMD /etc/init.d/fcgiwrap start && nginx
Cela fonctionnait facilement lorsque je l'installais normalement sur le système d'exploitation, mais lorsque je l'ai exécuté dans un conteneur, j'avais un problème.
--Si je pensais que la racine par défaut de Nginx était / usr / share / nginx / html /, je faisais référence à / var / www / html ''. Étant donné que l'utilisation du conteneur est limitée, je l'ai résolu en supprimant / etc / nginx / sites-enabled / default '' sans enquêter.
--Il n'y avait pas de fcgiwrap.socket ''. J'ai ajouté /etc/init.d/fcgiwrap start` `` à CMD et l'ai créé lorsque le conteneur a démarré.
 `chmod et `chown```.default.conf
Il s'agit du fichier de configuration Nginx.
default.conf
server {
  listen       80;
  server_name  localhost;
  location ~ \.sh$ {
    root   /usr/share/nginx/html/;
    include           /etc/nginx/fastcgi_params;
    fastcgi_index     index.sh;
    fastcgi_param     SCRIPT_FILENAME  $document_root$fastcgi_script_name;
    fastcgi_pass      unix:/var/run/fcgiwrap.socket;
  }
}
Aucun problème par rapport à Dockerfile.
index.sh
Lit et affiche le fichier de nom d'hôte monté.
index.sh
#!/bin/sh
host_name=$(cat hostname)
echo "Content-type:text/html"
echo ""
echo "<html><head>"
echo "<title>${host_name}</title>"
echo '<meta http-equiv="Content-type" content="text/html;charset=UTF-8">'
echo "</head><body>"
echo "HOSTNAME : ${host_name}"
echo "</body></html>"
De même, sans aucun problème.
Le nom de l'image est "nginx-display-hostname".
Mettez les trois fichiers dans le même répertoire et exécutez   docker build```.
$ docker image build -t nginx-display-hostname .
$ docker container run -d -v /etc/hostname:/usr/share/nginx/html/hostname -p 80:80 nginx-display-hostname
$ curl http://localhost/index.sh
<html><head>
<title>dockerhost.example.jp</title>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
</head><body>
HOSTNAME : dockerhost.example.jp
</body></html>
Vérifiez également à partir du navigateur.
//[Adresse IP de l'hôte Docker]/index.Accéder à sh.
HOSTNAME : dockerhost.example.jp
## Travailler sur Kubernetes
 Vous devez monter `` / etc / hostname '' en utilisant volumeMounts et volumes.
#### **`sample.yaml`**
```yaml
apiVersion: v1
kind: Namespace
metadata:
  name: nginx-prod #nom de l'espace de noms
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment #Nom du déploiement(C'est aussi le nom du réplicaset)
  namespace: nginx-prod #nom de l'espace de noms
spec:
  selector:
    matchLabels: #Création d'un réplicaset pour les pods avec des libellés correspondants
      app: nginx-pod
  replicas: 2
  template: #Modèle de pod
    metadata:
      name: nginx-pod #Nom du pod
      namespace: nginx-prod #Le nom de l'espace de noms du pod
      labels: #Étiquette du pod
        app: nginx-pod
    spec:
      containers: #Paramètres du conteneur
        - name: nginx-container #Le nom du conteneur
          image: yasthon/nginx-display-hostname #Nom de l'image
          env:
            - name: nginx-container
          ports:
            - containerPort: 80 #Port à conteneurs
          volumeMounts:
            - name: file-hostname
              mountPath: /usr/share/nginx/html/hostname
      volumes:
        - name: file-hostname
          hostPath:
            path: /etc/hostname
Démarrez le pod.
$ kubectl apply -f sample.yaml
namespace/nginx-prod created
deployment.apps/nginx-deployment created
Vérifiez le nom du pod.
$ kubectl get all -n nginx-prod
NAME                                    READY   STATUS    RESTARTS   AGE
pod/nginx-deployment-7ff4cc65cd-6r4qv   1/1     Running   0          3m52s
pod/nginx-deployment-7ff4cc65cd-djm9r   1/1     Running   0          3m52s
NAME                               READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/nginx-deployment   2/2     2            2           3m53s
NAME                                          DESIRED   CURRENT   READY   AGE
replicaset.apps/nginx-deployment-7ff4cc65cd   2         2         2       3m53s
Vérifiez l'adresse IP dans les détails du pod.
$ kubectl describe pod/nginx-deployment-7ff4cc65cd-djm9r -n nginx-prod | grep ^IP:
IP:           10.244.1.5
Accédez à l'adresse IP confirmée depuis le travailleur.
$ curl http://10.244.1.5/index.sh
<html><head>
<title>worker.example.jp</title>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8">
</head><body>
HOSTNAME : worker.example.jp
</body></html>
Il a été confirmé que le pod (nginx-deployment-7ff4cc65cd-6r4qv) a été démarré sur l'hôte worker.example.jp. Un service est requis pour l'accès au navigateur depuis l'extérieur du cluster.
Je pensais pouvoir y arriver bientôt, mais cela a pris un temps inattendu. J'espère qu'il sera utile à ceux qui en ont besoin.
Recommended Posts