k8s-DNS、探针五
k8s自动发现
Kubernetes中有一个很重要的特性,服务自发现。一旦一个service被创建,该service的service IP和service port等信息都可以被注入到pod中供它们使用。Kubernetes主要支持两种service发现 机制:环境变量和DNS。没有dns服务的时候,kubernetes会采用环境变量的形式,一旦有很多个service,环境变量会变得很复杂,为了解决这个问题,我们使用DNS服务.
进入pod:
[root@k8s-master k8s]# kubectl exec -it nginx-deployment-3972645106-34cbj /bin/bash 进入pod查看系统版本和环境变量
nginx-deployment-3972645106-34cbj---pod的name
进入pod后执行:有多少service(SVC)进入pod后,就会增加对应服务名字的环境变量,新创svc资源前起的pod不会有这环境变量,可以利用deploy创建3个pod之后,再删除一个pod,再创建SVC,deploy就会自动新增一个pod,保证副本数为3.这样每个pod进去之后就会有新增service相关的环境变量。
缺点是:我们新增service服务多的话,环境变量也会多,太复杂了,为了解决这个问题,我们用DNS,就不用env了
root@nginx-deployment-3972645106-vdrgw:/# env | grep -iE "kubernetes|myweb"
搭建DNS:
在k8s中所有的附加组件都可以起容器。
资料下载地址:https://www.qstack.com.cn/skydns.zip
rc.yaml是起DNS服务的;svc是定义vip地址和端;test是测试DNS的
[root@k8s-master skydns]# grep 192.168.23.146 skydns-rc.yaml -B 5 -C 5 timeoutSeconds: 5 args: - --domain=cluster.local. - --dns-port=10053 - --config-map=kube-dns - --kube-master-url=http://192.168.23.146:8080 #这个要配置master的IP # This should be set to v=2 only after the new image (cut from 1.5) has # been released, otherwise we will flood the logs. - --v=0 #__PILLAR__FEDERATIONS__DOMAIN__MAP__ env:
name: dnsmasq --缓存DNS查询记录的
image: myhub.fdccloud.com/library/kube-dnsmasq-amd64:1.4
name: dnsmasq-metrics ---后期配合做监控的
image: myhub.fdccloud.com/library/dnsmasq-metrics-amd64:1.0
- name: healthz --健康检查的
image: myhub.fdccloud.com/library/exechealthz-amd64:1.2
[root@k8s-master skydns]# kubectl create -f skydns-rc.yaml
[root@k8s-master skydns]# egrep -v "^$|#" skydns-svc.yaml apiVersion: v1 kind: Service metadata: name: kube-dns namespace: kube-system labels: k8s-app: kube-dns kubernetes.io/cluster-service: "true" kubernetes.io/name: "KubeDNS" spec: selector: k8s-app: kube-dns clusterIP: 10.254.230.254 #DNS的VIP ports: - name: dns port: 53 protocol: UDP - name: dns-tcp port: 53 protocol: TCP [root@k8s-master skydns]#
[root@k8s-master skydns]# kubectl create -f skydns-svc.yaml
[root@k8s-master skydns]# kubectl get namespace 查看命名空间
NAME STATUS AGE
default Active 6d
kube-system Active 6d
[root@k8s-master skydns]# kubectl get all -o wide #查的命名空间默认是default的,其他命名空间下的资源要加指定参数
[root@k8s-master skydns]# kubectl get all -o wide --namespace=kube-system #查看命名空间为kube-system下的所有资源
会起一个pod的容器和四个服务容器,服务容器的IP和pod容器IP共用
修改所有node节点kubelet配置:
修改各node节点上的/etc/kubernetes/kubelet配置文件,增加如下行:前面skydns-rc.yaml配置的
KUBELET_ARGS="--cluster_dns=10.254.230.254 --cluster_domain=cluster.local"
重启各node节点kubelet:
systemctl restart kubelet
检验dns是否生效:
创建测试pod:kubectl create -f test_dns_pod.yaml
进入测试pod:kubectl exec -it busybox2 sh
域名解析测试
nslookup kubernetes
当配置没有问题报错信息如下时:
[root@k8s-master skydns]# kubectl exec -it busybox2 sh
/ # nslookup myweb-svc
Server: 192.168.23.2
Address: 192.168.23.2:53
** server can't find myweb-svc.default.svc.cluster.local: NXDOMAIN
*** Can't find myweb-svc.svc.cluster.local: No answer
*** Can't find myweb-svc.cluster.local: No answer
*** Can't find myweb-svc.localdomain: No answer
*** Can't find myweb-svc.default.svc.cluster.local: No answer
*** Can't find myweb-svc.svc.cluster.local: No answer
*** Can't find myweb-svc.cluster.local: No answer
*** Can't find myweb-svc.localdomain: No answer
/ # nslookup kubernetes
Server: 192.168.23.2
Address: 192.168.23.2:53
** server can't find kubernetes.default.svc.cluster.local: NXDOMAIN
*** Can't find kubernetes.svc.cluster.local: No answer
*** Can't find kubernetes.cluster.local: No answer
*** Can't find kubernetes.localdomain: No answer
*** Can't find kubernetes.default.svc.cluster.local: No answer
*** Can't find kubernetes.svc.cluster.local: No answer
*** Can't find kubernetes.cluster.local: No answer
*** Can't find kubernetes.localdomain: No answer
可以改下测试镜像,我改成centos就欧克
[root@k8s-master skydns]# cat test_dns_pod.yaml apiVersion: v1 kind: Pod metadata: labels: name: busybox role: master name: busybox2 spec: containers: - name: busybox image: 192.168.23.146:5000/centos69:v1 imagePullPolicy: IfNotPresent command: - sleep - "3600"
检验dns是否生效
创建测试pod
kubectl create -f test_dns_pod.yaml
进入测试pod
kubectl exec -it busybox2 sh
域名解析测试
nslookup kubernetes 解析出了10.254.0.1
nslookup myweb-svc 解析出了10.254.239.220 与kubectl get svc -o wide结果一样
注意:在DNS创建之前起的pod,是无法解析的;重新创建个pod就ok;以后内部涉及到cluster Ip 的时候直接就可以写名字了;这是解析的不同namespace下的SVC
探针-健康检查:
如果没有探针,k8s无法知道应用是否还活着,只要进程还在运行,k8s则认为容器是健康的
探针种类:
livenessProbe:健康状态检查,周期性检查服务(也就是容器)是否存活,检查结果失败,将重启容器
readinessProbe:是不是准本好,可用性检查,周期性检查服务是否可用,不可用将从service的endpoints中移除
探针的检测方法
* exec:执行一段命令;在容器内执行任意命令,并检查命令退出状态码,如果状态码为0,则探测成功,否则探测失败容器重启
* httpGet:检测某个 http 请求的返回状态码;如果探测器收到响应,并且响应码是200--300,则认为探测成功
* tcpSocket:测试某个端口是否能够连接
vim nginx_pod_exec.yaml
apiVersion: v1 kind: Pod metadata: name: exec spec: containers: - name: nginx image: 192.168.23.146:5000/nginx:1.13 #用的是私有仓库的镜像 ports: - containerPort: 80 args: #会替换掉容器的初始命令 - /bin/sh - -c - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600 livenessProbe: exec: command: - cat - /tmp/healthy #这个文件如果看不了,就会重启容器 initialDelaySeconds: 5 #健康检查的初始间隔,初始完成后5s开始检查 periodSeconds: 5 #检查周期5s
[root@k8s-master skydns]# kubectl create -f nginx_pod_exec.yaml execpod起了一个nginx容器
execpod起来之后,容器也起来了,
当Container启动时,它会执行以下命令:
/bin/sh -c "touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600"
在Container的生命的前30秒,有一个/tmp/healthy
文件。因此,在前30秒内,该命令cat /tmp/healthy
返回成功代码。30秒后,cat /tmp/healthy
返回失败代码,就会重启容器。
我们可以看事件:kebectl describe pod exec
由上图可知,重启了一次。
liveness探针的httpGet使用:
vim nginx_pod_httpGet.yaml apiVersion: v1 kind: Pod metadata: name: httpget spec: containers: - name: nginx image: 192.168.23.146:5000/nginx:1.13 #使用的是私有镜像 ports: - containerPort: 80 livenessProbe: httpGet: path: /index.html # port: 80 # initialDelaySeconds: 3
periodSeconds: 3
[root@k8s-master skydns]# kubectl create -f nginx_pod_httpGet.yaml
查看事件正常;
[root@k8s-master skydns]# kubectl exec -it httpget /bin/bash 我们进入容器,将html移除,健康机制就会报错,容器也会被干掉,重新创建了个新容器
liveness探针的tcpSocket使用:检测端口是不是存在,重点掌握上面两种
vi nginx_pod_tcpSocket.yaml apiVersion: v1 kind: Pod metadata: name: tcpSocket spec: containers: - name: nginx image: 192.168.23.146:5000/nginx:1.13 #使用私有仓库镜像 ports: - containerPort: 80 livenessProbe: tcpSocket: port: 80 initialDelaySeconds: 3 periodSeconds: 3
readiness探针的httpGet使用:容器的可用性
nginx-rc-httpGet.yaml
[root@k8s-master skydns]# vim nginx-rc-httpGet.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: readiness
spec:
replicas: 2
selector:
app: readiness
template:
metadata:
labels:
app: readiness
spec:
containers:
- name: readiness
image: 192.168.23.146:5000/nginx:1.13
ports:
- containerPort: 80
readinessProbe:
httpGet:
path: /qiangge.html #访问的是站点下面的qiangge.html,当文件不存在时候,不会自动加入到SVC中
port: 80
initialDelaySeconds: 3
periodSeconds: 3
我们还要建个SVC,我们通过命令行的模式创建:
[root@k8s-master skydns]# kubectl create -f nginx-rc-httpGet.yaml
[root@k8s-master skydns]# kubectl expose rc readiness --port=80
[root@k8s-master skydns]# kubectl describe svc readiness #由于访问不到qiangge.html,所以endponit没有IP。我们可用进入pod,添加个qiangge.html,再观察下
我们要想终端IP,就写个文件就行了