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,就写个文件就行了

 

posted @ 2021-02-25 16:48  闲云野鹤cs  阅读(800)  评论(0编辑  收藏  举报