赞
踩
搭建K8S文档:yum安装K8S
ansible搭建K8S集群:ansible搭建K8S
准备至少3个机器搭建好K8S集群测试调度
节点名称 | IP |
---|---|
k8s-master | 192.168.116.130 |
k8s-node1 | 192.168.116.131 |
k8s-node2 | 192.168.116.132 |
原理:在K8S集群中,为了测试pod是否正常运行,可以通过kubelet定期对pod进行健康检查,从而保证服务正常运行。
kubelet检查机制:
探针的返回结果:
探针的类型:
探针主要字段解析:
在master创建容器
vi nginx.yml apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx name: nginx-deployment namespace: default spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: docker.io/library/nginx:1.18.0-alpine livenessProbe: exec: #定义探测方式 command: #不断查看文件是否存在,文件必须是镜像原本存在的文件 - cat - /usr/share/nginx/html/index.html initialDelaySeconds: 5 #指定探针多少秒后启动 periodSeconds: 5 #指定探针探测周期时间 kubectl apply -f nginx-exec.yml 创建容器 kubectl get pod -A 查看容器状态 kubectl exec -it nginx-deployment-b8b54fbc4-l26kg /bin/sh 连接容器 cd /usr/share/nginx/html/ 进入目录,可以看到文件存在 ls mv index.html index1.html 删除文件,这样探针就会被触发 ls kubectl get pod -A 可以看到RESTARTS变成了1,证明容器重启过了 kubectl exec -it nginx-deployment-b8b54fbc4-l26kg /bin/sh 再次连接容器 cd /usr/share/nginx/html/ 可以看到文件又存在了,证明容器被重建了。 ls
在master创建容器
vi nginx-httpGet.yml apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx name: nginx-deployment namespace: default spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: docker.io/library/nginx:1.18.0-alpine livenessProbe: httpGet: #指定探针探测方式 path: /index.html #定义请求的URL port: 80 #定义GET的端口 initialDelaySeconds: 3 #指定探针多少秒后启动 periodSeconds: 3 #指定探针的探测周期 kubectl apply -f nginx-httpGet.yml 创建容器 kubectl get pod -A 查看状态 kubectl exec -it nginx-deployment-7bfddd86d7-247jn /bin/sh 连接容器 cd /usr/share/nginx/html/ 进入目录,可以看到文件存在 ls mv index.html index1.html 删除文件,这样探针就会被触发 ls kubectl get pod -A 可以看到RESTARTS变成了1,证明容器重启过了 kubectl exec -it nginx-deployment-7bfddd86d7-247jn /bin/sh 再次连接容器 cd /usr/share/nginx/html/ 可以看到文件又存在了,证明容器被重建了。 ls
在master创建容器
vi nginx-tcp.yml apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx name: nginx-deployment namespace: default spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: docker.io/library/nginx:1.18.0-alpine ports: - containerPort: 80 livenessProbe: #指定探针 tcpSocket: #指定探针探测方式 port: 80 initialDelaySeconds: 5 periodSeconds: 5 kubectl apply -f nginx-tcp.yml 创建容器 kubectl get pod -A 查看pod kubectl exec -it nginx-deployment-575f4cf6cf-nv9cv /bin/sh 连接容器 vi /etc/nginx/conf.d/default.conf 修改配置文件 server { listen 8080; #把80都改为8080 listen [::]:8080; nginx -s reload 重新加载配置文件 kubectl get pod -A 查看pod,可以看到RESTARTS,证明容器重启过 kubectl exec -it nginx-deployment-575f4cf6cf-nv9cv /bin/sh 连接容器 head -n 10 /etc/nginx/conf.d/default.conf 可以看到配置被还原了,证明容器重建了
在master创建容器
vi nginx-re-exec.yml apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx name: nginx namespace: default spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: docker.io/library/nginx:1.18.0-alpine ports: - containerPort: 80 readinessProbe: #指定探针 exec: #指定探针探测方式 command: - cat - /usr/share/nginx/html/index.html initialDelaySeconds: 5 periodSeconds: 5 --- apiVersion: v1 kind: Service metadata: labels: svc: nginx-svc-nodeport name: nginx-svc-nodeport spec: type: NodePort ports: - port: 80 targetPort: 80 nodePort: 30080 selector: app: nginx kubectl apply -f nginx-re-exec.yml 创建容器 kubectl get pod -A -o wide 查看容器的创建节点 kubectl get svc -o wide 查看service kubectl describe svc nginx-svc-nodeport 查看pod和service绑定 curl -I http://192.168.116.132:30080 访问网站成功
在master连接容器删除文件测试
kubectl get pod -A -o wide 查看容器名字,可以看到原本READY是1/1
kubectl exec -it nginx-86d859557f-vw87x /bin/sh 连接容器
cd /usr/share/nginx/html/ 修改探针指定探测的文件名字,让探针触发
ls
mv index.html index1.html
exit
kubectl get pod -A -o wide 可以看到READY变成了0/1,证明探针被触发了,容器没有被删除,也没有重建
curl -I http://192.168.116.132:30080 可以看到网站访问不了
kubectl describe svc nginx-svc-nodeport 可以看到Endpoints没有值,证明探针把service和pod解除绑定了
在master创建容器
vi nginx-re-httpGet.yml apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx name: nginx namespace: default spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: docker.io/library/nginx:1.18.0-alpine ports: - containerPort: 80 readinessProbe: #指定探针 httpGet: #指定探针方式 path: /index.html port: 80 initialDelaySeconds: 5 periodSeconds: 5 --- apiVersion: v1 kind: Service metadata: labels: svc: nginx-svc-nodeport name: nginx-svc-nodeport spec: type: NodePort ports: - port: 80 targetPort: 80 nodePort: 30080 selector: app: nginx kubectl apply -f nginx-re-httpGet.yml 创建容器 curl -I http://192.168.116.132:30080 和上面一样,访问网站成功 kubectl get pod -A -o wide 查看容器名字,可以看到原本READY是1/1 kubectl exec -it nginx-75f8cfd9d-6x8jz /bin/sh 连接容器 cd /usr/share/nginx/html/ 修改探针指定探测的文件名字,让探针触发 ls mv index.html index1.html exit kubectl get pod -A -o wide 可以看到READY变成了0/1,证明探针被触发了,容器没有被删除,也没有重建 curl -I http://192.168.116.132:30080 可以看到网站访问不了 kubectl describe svc nginx-svc-nodeport 可以看到Endpoints没有值,证明探针把service和pod解除绑定了
在master创建容器
vi nginx-re-tcpSocket.yml apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx name: nginx namespace: default spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: docker.io/library/nginx:1.18.0-alpine ports: - containerPort: 80 readinessProbe: #指定探针 tcpSocket: #指定探测方式 port: 80 initialDelaySeconds: 5 periodSeconds: 5 --- apiVersion: v1 kind: Service metadata: labels: svc: nginx-svc-nodeport name: nginx-svc-nodeport spec: type: NodePort ports: - port: 80 targetPort: 80 nodePort: 30080 selector: app: nginx kubectl apply -f nginx-re-tcpSocket.yml 创建容器 curl -I http://192.168.116.132:30080 和上面一样,访问网站成功 kubectl get pod -A 查看pod kubectl exec -it nginx-6bf8bf8577-9skvn /bin/sh 连接容器 vi /etc/nginx/conf.d/default.conf 修改配置文件 server { listen 8080; #把80都改为8080 listen [::]:8080; nginx -s reload 重新加载配置文件 kubectl get pod -A 可以看到READY变成了0/1,证明探针被触发了,容器没有被删除,也没有重建 curl -I http://192.168.116.132:30080 可以看到因为探针触发,外网是访问不了容器了
就绪探针不会影响pod和pod之间的访问,新建测试容器测试
kubectl run net-test1 --image=alpine sleep 360000 创建容器
kubectl get pod -A -o wide 查看pod的IP
kubectl exec -it net-test1 /bin/sh 连接容器
可以看到只要指定改过的pod的端口,pod和pod之间还是可以访问的
wget http://20.0.1.36:8080
ls
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。