原生Kubernetes容器云平台基本测试使用

Posted 人间忽晚,山河以秋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原生Kubernetes容器云平台基本测试使用相关的知识,希望对你有一定的参考价值。

学习目标:
1、了解kubernetes IPVS的工作原理和开启方式。
2、掌握kubernetes 节点的调度方法。
3、掌握kubernetes 服务的运行方式

基于kubernetes集群已部署完成

一、IPVS的工作原理和开启方式。
1、IPVS的工作原理
IPVS是基于TCPSYNC包开始为一个TCP连接所有的数据包,建立状态跟踪机制,保证一个TCP 连接中所有的数据包能到同一个后端。所以IPVS 是基于TCP状态机进行控制管理,只感知TCP头而不对TCP的payload进行查看;因此,对IPVS后端服务器集群还有一个假定,那就是所有后端都具有同样的应用层的服务功能,但是由于IPVS可以给后端设定权重,所以每个后端的服务的能力可以不同。
一个合理的负载均衡软件,应该能够尽量提高服务接入能力(Request Per Second,ReqPS),而将服务处理能力(Response Per second,ResPS)通过合理分配后端来达到最佳。
根据处理请求和响应数据包的模式的不同,IPVS具有如下4种工作模式:
① NAT模式
② DR(Direct Routing)模式
③ TUN(IP Tunneling)模式
④ FULLNAT模式
而根据响应数据包返回路径的不同,可以分为如下两种模式:
① 双臂模式:请求、转发和返回在同一路径上,client和IPVS director、IPVS director和后端real server都是由请求和返回2个路径连接。
② 三角模式:请求、转发和返回3个路径连接client、IPVS director和后端real server成为一个三角形。
2、IPVS 的开启方式
(1)修改配置文件
在master节点,修改ConfigMap 的 kube-system/kube-proxy 中的config.conf 文件,修改为 mode:“ipvs”

[root@master ~]# kubectl edit cm kube-proxy -n kube-system
.......
 mode: "ipvs" 

使用方法和vi编辑器的使用一样,i 进入编辑模式 Esc 退出编辑模式,:wq 保存
(2)重启Kube-proxy

[root@master ~]#  kubectl get pod -n kube-system | grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'
pod "kube-proxy-jpfj2" deleted
pod "kube-proxy-xstzj" deleted

因为已经通过ConfigMap 修改了kube-proxy的配置,所以后期增加的Node 节点,会直接使用IPVS模式。

[root@master ~]# kubectl get pod -n kube-system | grep kube-proxy 
kube-proxy-bjdbn                        1/1     Running   0          7m19s
kube-proxy-fz6b5                        1/1     Running   0          7m12s

查看日志,命令中kube-proxy-bjdbn 使用上边的命令获得,查看自己的组件日志

[root@master ~]# kubectl logs kube-proxy-bjdbn -n kube-system
I0609 14:46:24.683654       1 server_others.go:177] Using ipvs Proxier.
W0609 14:46:24.683923       1 proxier.go:381] IPVS scheduler not specified, use rr by default
I0609 14:46:24.684032       1 server.go:555] Version: v1.14.1
I0609 14:46:24.692710       1 conntrack.go:52] Setting nf_conntrack_max to 131072
I0609 14:46:24.692935       1 config.go:202] Starting service config controller
I0609 14:46:24.692951       1 controller_utils.go:1027] Waiting for caches to sync for service config controller
I0609 14:46:24.692961       1 config.go:102] Starting endpoints config controller
I0609 14:46:24.692968       1 controller_utils.go:1027] Waiting for caches to sync for endpoints config controller
I0609 14:46:24.793128       1 controller_utils.go:1034] Caches are synced for endpoints config controller
I0609 14:46:24.793144       1 controller_utils.go:1034] Caches are synced for service config controller

日志中打印出了Using ipvs Proxier,说明IPVS模式已经开启。
(3)测试IPVS
使用ipvsadm测试,可以查看之前创建的Service已经使用LVS创建了集群。

[root@master ~]#  ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
  -> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.17.0.1:30000 rr
  -> 10.16.1.2:8443               Masq    1      0          0         
TCP  10.16.0.0:30000 rr
  -> 10.16.1.2:8443               Masq    1      0          0         
TCP  10.16.0.0:31000 rr
  -> 10.16.1.3:80                 Masq    1      0          0         
TCP  10.16.0.1:30000 rr
  -> 10.16.1.2:8443               Masq    1      0          0         
TCP  10.16.0.1:31000 rr
  -> 10.16.1.3:80                 Masq    1      0          0         
TCP  10.30.59.248:30000 rr
  -> 10.16.1.2:8443               Masq    1      0          0         
TCP  10.30.59.248:31000 rr
  -> 10.16.1.3:80                 Masq    1      0          0         
TCP  10.96.0.1:443 rr
  -> 10.30.59.248:6443            Masq    1      0          0         
TCP  10.96.0.10:53 rr
  -> 10.16.0.2:53                 Masq    1      0          0         
  -> 10.16.0.3:53                 Masq    1      0          0         
TCP  10.96.0.10:9153 rr
  -> 10.16.0.2:9153               Masq    1      0          0         
  -> 10.16.0.3:9153               Masq    1      0          0         
TCP  10.106.218.143:443 rr
  -> 10.16.1.2:8443               Masq    1      0          0         
TCP  10.107.87.231:80 rr
  -> 10.16.1.3:80                 Masq    1      0          0         
TCP  127.0.0.1:30000 rr
  -> 10.16.1.2:8443               Masq    1      0          0         
TCP  127.0.0.1:31000 rr
  -> 10.16.1.3:80                 Masq    1      0          0         
TCP  172.17.0.1:31000 rr
  -> 10.16.1.3:80                 Masq    1      0          0         
UDP  10.96.0.10:53 rr
  -> 10.16.0.2:53                 Masq    1      0          0         
  -> 10.16.0.3:53                 Masq    1      0          0 

二、kubernetes 节点的调度方法
出于安全考虑,默认配置下Kubernetes不会将Pod调度到Master节点。查看Master节点Taints字段默认配置:
注意观察这里的Taints这一行

[root@master ~]# kubectl describe node master
Name:               master
Roles:              master
Labels:             beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/os=linux
                    kubernetes.io/arch=amd64
                    kubernetes.io/hostname=master
                    kubernetes.io/os=linux
                    node-role.kubernetes.io/master=
Annotations:        flannel.alpha.coreos.com/backend-data: {"VtepMAC":"ba:e4:f7:04:f1:2a"}
                    flannel.alpha.coreos.com/backend-type: vxlan
                    flannel.alpha.coreos.com/kube-subnet-manager: true
                    flannel.alpha.coreos.com/public-ip: 10.30.59.248
                    kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock
                    node.alpha.kubernetes.io/ttl: 0
                    volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp:  Wed, 09 Jun 2021 03:47:22 +0800
Taints:             node-role.kubernetes.io/master:NoSchedule
Unschedulable:      false
......

如果希望将k8s-master也当作Node节点使用,可以执行如下命令:

[root@master ~]#  kubectl taint node master node-role.kubernetes.io/master-
node/master untainted
node/master untainted

Taints的状态已经改变

[root@master ~]# kubectl describe node master
Name:               master
Roles:              master
Labels:             beta.kubernetes.io/arch=amd64
                    beta.kubernetes.io/os=linux
                    kubernetes.io/arch=amd64
                    kubernetes.io/hostname=master
                    kubernetes.io/os=linux
                    node-role.kubernetes.io/master=
Annotations:        flannel.alpha.coreos.com/backend-data: {"VtepMAC":"ba:e4:f7:04:f1:2a"}
                    flannel.alpha.coreos.com/backend-type: vxlan
                    flannel.alpha.coreos.com/kube-subnet-manager: true
                    flannel.alpha.coreos.com/public-ip: 10.30.59.248
                    kubeadm.alpha.kubernetes.io/cri-socket: /var/run/dockershim.sock
                    node.alpha.kubernetes.io/ttl: 0
                    volumes.kubernetes.io/controller-managed-attach-detach: true
CreationTimestamp:  Wed, 09 Jun 2021 03:47:22 +0800
Taints:             <none>

三、kubernetes 服务的运行方式
运行容器
1、运行nginx应用
运行具有4个副本的nginx应用

[root@master ~]# kubectl run nginx --image=nginx:latest --replicas=4
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/nginx created

2、查看Pods是否正常运行

[root@master ~]# kubectl get pods
NAME                    READY   STATUS             RESTARTS   AGE
nginx-ccb467dc5-8qshk   0/1     ImagePullBackOff   0          56s
nginx-ccb467dc5-9zrwm   1/1     Running            0          56s
nginx-ccb467dc5-qsrvg   0/1     ImagePullBackOff   0          56s
nginx-ccb467dc5-sgz5p   1/1     Running            0          56s

有的启动需要一些时间

[root@master ~]#  kubectl get pods
NAME                    READY   STATUS    RESTARTS   AGE
nginx-ccb467dc5-8qshk   1/1     Running   0          18h
nginx-ccb467dc5-9zrwm   1/1     Running   0          18h
nginx-ccb467dc5-qsrvg   1/1     Running   0          18h
nginx-ccb467dc5-sgz5p   1/1     Running   0          18h

3、开放端口
使用expose将service的80端口开放出去。

[root@master ~]# kubectl expose deploy/nginx --port 80
service/nginx exposed

4、测试Nginx应用

[root@master ~]# kubectl get svc
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP   19h
nginx        ClusterIP   10.108.243.29   <none>        80/TCP    20s
[root@master ~]# curl 10.108.243.29:80
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

使用curl工具可以成功获取到Nginx网页信息,说明80端口已开放成功。

以上是关于原生Kubernetes容器云平台基本测试使用的主要内容,如果未能解决你的问题,请参考以下文章

原生Kubernetes容器云平台应用部署WordPress

原生Kubernetes容器云平台应用部署-YAML的语法

有赞容器中间件开发|云原生招聘信息

云原生DevOps:Kubernetes编排工具

云原生(三十一) | Kubernetes篇之Kubernetes平台基本预装资源

一文了解 Rainbond 云原生应用管理平台