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