基于CCE Kubernetes网络与持久化存储实战
实验手册

来源:https://edu.huaweicloud.com/lab/experiment-detail_2309(华为云开发者云实验 KooLabs)

实验目标与基本要求:指导用户基于华为云容器引擎 CCE,完成 Kubernetes 网络与持久化存储实操。通过本实验,您将能够:

1、掌握 Kubernetes 网络、Service 实操

2、掌握 Kubernetes 存储实操

3、掌握 Kubernetes 控制器 StatefulSet 创建

实验摘要(操作前提):1.安装 kubernetes 客户端 2.Kubernetes 网络 3.Service 服务发现 4.Kubernetes 存储 5.有状态负载 StatefulSet

实验所用产品:弹性云服务器 ECS、虚拟私有云 VPC、弹性公网 IP、云容器引擎 CCE

基于CCE Kubernetes网络与持久化存储实战

本实验指导用户基于基于云容器引擎CCE, 完成Kubernetes网络与持久化存储实操。

操作前提:

① 预置实验环境

注意:进入实验环境后系统会自动预置环境,显示“资源准备中,预计需要1~2分钟,请耐心等待”,实验环境预置成功后显示如下。

图 1

1. 预置实验环境需几分钟,成功后将会创建本实验所需的云资源(例如VPC、安全组或云服务器)。

2. 如有预置的 ECS 资源,其用户、密码信息可点击实验操作桌面下方按钮查看。

图 2

② 登录华为云

进入【实验操作桌面】,点击【一键登录】,可自动登录并进入华为云控制台页面。

图 3

注意:进入华为云控制台后,请确保右上角的实验账号与手册左上角提供的账号信息一致,切勿使用您自己的华为云账号登录。

图 4

③ 购买云容器引擎服务CCE

切换到“操作前提:登录华为云”步骤已登录的华为云控制台界面,鼠标移动到云桌面浏览器页面中左侧菜单栏,点击“服务列表”->“容器”->“云容器引擎CCE”,进入云容器引擎CCE控制台,如下图所示:

图 5

点击“购买集群”按钮,进入云容器引擎CCE购买页面。

图 6

CCE Standard 集群,配置参数如下:

① 计费模式:按需计费

② 集群名称:cce01

③ 集群版本:v1.35 或选择其他推荐版本(本实验手册以v1.35为例)

④ 集群委托:使用已有委托,CCEAutoClusterAgency,勾选“我确认委托已授予集群所需的权限。”

⑤ 集群规模:50节点

⑥ 集群masters实例数:单实例

⑦ 虚拟私有云&默认节点子网:选择预置环境预置的VPC和子网

⑧ 节点默认安全组:保持默认

⑨ 容器网络模型&容器网段:容器隧道网络 ,自动设置网段

⑩ 服务转发模式:iptables

其它参数默认,如下图所示:

图 7 图 8 图 9 图 10

点击“下一步:插件选择”,取消所有勾选插件,只默认安装基础功能插件;

图 11

点击“下一步:插件配置”,调整适配参数如下:

图 12 图 13

点击“下一步:确认配置”,在配置确认界面勾选“我已阅读并知晓上述使用说明”,点击“提交”按钮。

开始创建集群。(集群创建需要3-5min)

图 14

完成集群配置后,在集群创建界面点击“创建节点”。

图 15

进入创建节点界面。在“创建节点”步骤中,除配置如下参数外,其它默认:

节点配置

① 计费模式:按需计费

② 可用区:随机分配

③ 节点类型:弹性云服务器-虚拟机

④ 容器引擎:Containerd

⑤ 节点规格:c7.xlarge.2 4核|8GB(如此规格售罄请选择其他4核|8GB的规格)

图 16

① 操作系统:公共镜像 Huawei Cloud EulerOS 2.0

② 节点名称:cce01-node1

③ 登录方式:选择“密码”:输入自己想要设置的密码

图 17 图 18

存储配置

存储配置:保持默认。

网络配置

① 虚拟私有云:保持默认

② 节点子网:点击下拉箭头选择默认

③ 节点IP:自动分配

④ 弹性公网IP:自动创建

⑤ 规格:全动态BGP

⑥ 计费方式:按带宽计费

⑦ 带宽:5Mbit/s

其它参数默认,如下图所示:

图 19

点击“ 下一步规格确认”

在确认界面勾选“我已阅读并知晓上述使用说明”,点击提交按钮,开始创建节点。

图 20

在节点管理界面可以看到节点正在创建中。

图 21

1.安装kubernetes客户端

1.1.登录弹性云服务器ECS

鼠标移动到云桌面浏览器页面中左侧菜单栏,点击“服务列表”->“计算”->“弹性云服务器ECS”进入服务器列表,找到系统创建的弹性云服务器“ecs-k8s”。

图 22

① 双击实验操作桌面的“Xfce终端”打开Terminal,输入以下命令登录云服务器,请使用弹性云服务器ECS ecs-k8s的公网IP替换命令中的【EIP】:

ssh root@EIP

② 接受秘钥输入“yes”,回车;

③ 输入密码:使用预置环境信息中云服务器名称为ecs-k8s的用户密码(输入密码时,命令行窗口不会显示密码,输完之后直接键入回车)。成功登录云服务器之后如下图所示:

实验过程中请勿关闭该Terminal窗口,否则需要重复此步骤重新建立连接;

后续操作请保持Terminal窗口与云服务器的链接状态,以确保所有操作都执行在云服务器上。

图 23

1.2.下载上传kubectl配置

①下载kubectl:在CCE集群管理界面点击集群名称:

图 24

在集群信息界面下拉到下图位置,点击kubectl后面的“配置”:

图 25

首先下载kubectl,点击图示链接:

图 26

来到kubernetes版本发布页面:

图 27

本次安装版本为v1.28,点击CHANGELOG-1.28.md

图 28

下拉至v1.28.8,点击Downloads for v1.28.8

图 29

下拉,选择Client binaries中的 kubernetes-client-linux-amd64.tar.gz,点击右键,复制链接地址,记录此处链接为:https://dl.k8s.io/v1.28.8/kubernetes-client-linux-amd64.tar.gz

图 30

② 接下来下载kubectl配置文件。在步骤②页面中找到下载kubectl配置文件,点击”此处“下载kubectl配置文件到实验的操作桌面。

图 31

下载完成后,新打开一个“Xfce终端”,执行如下命令,上传配置文件到弹性云服务器ECS: 说明:请使用弹性云服务器ECS ecs-k8s的公网IP替换命令中的【EIP】,上传过程中需要输入云服务器ECS ecs-k8s的密码。

scp /home/user/Downloads/cce01-kubeconfig.yaml root@EIP:/root

上传成功如下图所示:

图 32

1.3.安装和配置kubectl

在登录弹性云服务器ecs-k8s的Xfce终端上,通过上步骤下载kubectl中,记录的 kubectl链接地址:https://dl.k8s.io/v1.28.8/kubernetes-client-linux-amd64.tar.gz来下载kubectl,并将kubectl和kubeconfig.json配置文件拷贝到/home目录下。

执行以下命令下载kubectl(为缩短下载速度,本文使用OBS链接)

wget https://edu-res.hc-cdn.cn/sharedata/hdinnovation/sandbox/2309/kubernetes-client-linux-amd64.tar.gz
图 33
ls
tar -zxvf kubernetes-client-linux-amd64.tar.gz
图 34

解压完成:

图 35

执行以下命令复制kubectl及配置文件。

cp /root/kubernetes/client/bin/kubectl /home/
cp cce01-kubeconfig.yaml /home/
cd /home

执行以下命令添加kubectl可执行权限,并将文件移动到/usr/local/bin目录。

chmod +x kubectl
mv kubectl /usr/local/bin

执行以下命令将配置文件复制到$HOME/.kube/config文件中。

mkdir $HOME/.kube
mv cce01-kubeconfig.yaml $HOME/.kube/config

执行以下命令切换kubectl的访问模式为VPC网络内接入访问。

kubectl config use-context internal

执行成功如下图所示:

图 36

执行以下命令验证kubectl安装结果。

kubectl cluster-info

验证结果如下图所示:

图 37

2.Kubernetes网络

2.1.Node与Pod间通信

执行以下命令创建一个Pod。

cd ~ && kubectl run nginx --image=nginx --port 80

创建成功如下图所示:

图 38

执行以下命令查看该Pod的IP地址及所处节点。

注意:因环境差异,不同用户看到的Pod IP地址不同,需要记录自己所看到的Pod IP地址。

kubectl get pods -o wide

Pod IP如下图所示:

图 39

从云容器引擎CCE节点访问该Pod(实际IP以实际输出为准)。

使用ssh命令登录云容器引擎CCE节点,命令中【cce01-node1- IP】为cce01-node1私网IP地址。

cce01-node1私网IP地址位置参考如下:

图 40

请手动打开cce01-node1对应的安全组的22端口。

图 41 图 42

请使用云服务器cce01-node1的私网地址替换命令中的【cce01-node1- IP】。

ssh cce01-node1-IP
图 43

执行以下命令访问刚刚创建的Pod。

请使用上面查看的nginx Pod的IP替换命令中的【Pod-IP】。

curl Pod-IP

执行成功说明Node与Pod正常通信,如下图所示:

图 44

2.2.Pod和Pod间通信

退出cce01-node1登录,执行以下命令创建一个client Pod,并进入该Pod的tty。

exit
kubectl run -it busybox --image=busybox

如下图所示:

图 45

切换至未登录弹性云服务器ECS ecs-k8s的Terminal窗口,参照1.1步骤操作进行登录,登录成功后执行以下命令查看Pod busybox 及 Pod nginx 的IP。

kubectl get pods -o wide
图 46

切换至已进入 busybox Pod的Terminal窗口,执行以下命令做连通性测试,从busybox Pod 访问nginx Pod服务。

说明:请使用Pod nginx IP替换命令中【pod-nginx-ip】。

telnet pod-nginx-ip 80

执行成功如下图所示:

图 47

Ctrl + C,执行以下命令退出busybox Pod并删除Pod资源。

exit
kubectl delete pod busybox nginx

删除成功如下图所示:

说明:删除Pod需要一定时间。

图 48

3.Service服务发现

3.1.创建Service服务

执行以下命令创建Service实验使用的目录。

mkdir -p /labfile/servicefile
cd /labfile/servicefile/

执行以下命令创建后端nginx Deployment。

vim nginx-deploy.yaml

按“i”键进行编辑,内容如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

按Esc键退出编辑,输入":wq"保存并退出。

:wq

执行以下命令部署Deployment。

kubectl apply -f nginx-deploy.yaml

执行以下命令查看创建后的Deployment。

kubectl get deployment
图 49

仿照创建nginx-deploy.yaml的方式创建nginx-service.yaml文件。

vim nginx-service.yaml

添加如下内容:

apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 80

保存后部署nginx-service.yaml。

kubectl apply -f nginx-service.yaml

查看service信息(注意!千万不可删除名称为kubernetes的服务,该服务为系统服务!)。

说明:因环境差异,不同用户看到的CLUSTER-IP地址不同,后续实验需要使用自己所看到的CLUSTER-IP地址。

kubectl get service
图 50

查看service中的endpoints。

kubectl get endpoints
图 51

3.2.测试Service服务连通性

切换至实验操作桌面已登录弹性云服务器ECS的Terminal,参照2.1步骤登录CCE节点。

说明:请使用云服务器cce01-node1的私网地址替换命令中的【cce01-node1- IP】。

ssh  cce01-node1-IP

登录成功后,使用curl <服务IP:端口号>查看回显,显示“Welcome to nginx!”表示成功。

说明:请使用服务IP替换命令中的 ,服务IP为3.1步骤查看的服务IP。

curl <nginx-svc CLUSTER-IP>:8080

回显成功如下图所示:

图 52

退出CCE节点,删除nginx-svc 服务。

exit
kubectl delete service nginx-svc

删除成功如下图所示:

图 53

参照3.1步骤创建配置文件方式,创建nginx-expose.yaml。

vim nginx-expose.yaml

按“i”键进行编辑,内容如下:

apiVersion: v1
kind: Service
metadata:
  name: nginx-svc
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 8080
    targetPort: 80
    nodePort: 30144

配置文件保存后创建服务。

kubectl apply -f nginx-expose.yaml

执行以下命令查看服务。

kubectl get service
图 54

使用弹性云服务器ECS ecs-k8s访问<节点IP地址:端口>,显示“welcome to nginx!”表示成功。说明:使用cce01-node1的私网IP替换命令中的【cce01-node1-IP】。

curl cce01-node1-IP:30144

访问成功如下图所示:

图 55

3.3.使用Service访问负载

参照3.1步骤创建配置文件方式创建client.yaml,用于创建一个客户端Pod,测试DNS功能。

vim client.yaml

按“i”键进行编辑,内容如下:

apiVersion: v1
kind: Pod
metadata:
  name: clientpod
spec:
  containers:
    - name: clientpod
      image: busybox:1.28.3
      args:
      - /bin/sh
      - -c
      - sleep 30000

保存配置文件后创建启动client。

kubectl apply -f client.yaml

创建成功后执行以下命令进入容器。

kubectl exec -it clientpod /bin/sh

进入容器成功如下图所示:

图 56

使用nslookup命令查看服务域名。

说明:使用3.2步骤查看的nginx-svc CLUSTER-IP替换命令中的【】。

nslookup <nginx-svc cluster IP>

访问成功后如下图所示,其中nginx-svc.default.svc.cluster.local为nginx-svc的完整域名。

图 57

使用wget命令通过域名访问服务。

wget nginx-svc:8080

验证成功如下图所示:

图 58

执行以下命令删除index文件并退出容器。

rm index.html
exit

4.Kubernetes存储

4.1.使用emptyDir

执行以下命令创建并切换到存储实验使用的目录。

mkdir /labfile/storagefile
cd /labfile/storagefile

参照3.1步骤配置文件创建操作,创建使用emptyDir的Pod的yaml文件。

vim empty-pod.yaml

按“i”键进行编辑,内容如下:

apiVersion: v1
kind: Pod
metadata:
  name: em
spec:
  containers:
  - image: ubuntu
    name: test-container
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
    args:
    - /bin/sh
    - -c
    - sleep 30000
  volumes:
  - name: cache-volume
    emptyDir: {}

保存成功后,执行以下创建Pod。

kubectl apply -f empty-pod.yaml

Pod创建成功后,进入容器,在emptyDir挂载的目录中创建一个文件。

kubectl exec em -it /bin/sh
cd /cache
cat > hello.file<<EOF
hello
world
EOF

创建成功后,退出容器。

exit

如下图所示:

图 59

查看Pod所在节点,可以看到Pod运行在node01上。

kubectl get pod -o wide
图 60

登录cce01-node1节点命令行,查看运行的容器。

说明:请使用云服务器cce01-node1的私网地址替换命令中的【cce01-node1- IP】。

ssh cce01-node1-IP

登录成功后执行以下命令查看容器。

crictl ps
图 61

执行以下命令查看容器挂载的目录。

说明:用上图创建的Pod主容器CONTAINER ID 替换命令中的 container-id。

crictl inspect container-id

可以看到挂载的source目录,如下图所示:

图 62

执行以下命令切换到host_path目录。

说明:用查看到的host_path目录替换命令中的source-folder

cd source-folder

执行以下命令可查看到上面操作创建的文件及内容。

ls
cat hello.file

如下图所示:

图 63

回到弹性云服务器ECS ecs-k8s并删除pod。

说明:删除 em Pod约需1分钟左右。

exit
kubectl delete pod em

重新登录cce01-node1节点,发现文件,以及目录都不存在。

说明:请使用云服务器cce01-node1的私网地址替换命令中的【cce01-node1- IP】。

ssh cce01-node1-IP
cd /var/lib/kubelet/pods
ll

结果如下图所示:

图 64

4.2.使用emptyDir的容量限制功能

退出云容器引擎CCE cce01-node1登录。

exit

参照3.1步骤配置文件创建操作,创建一个带容量限制的emptyDir Pod yaml,限制为1G。

vim limit-pod.yaml

按“i”键进行编辑,内容如下:

apiVersion: v1
kind: Pod
metadata:
  name: em2
spec:
  containers:
  - image: ubuntu
    name: test-container2
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
    args:
    - /bin/sh
    - -c
    - sleep 30000
  volumes:
  - name: cache-volume
    emptyDir:
      sizeLimit: 1Gi

配置文件保存后,执行配置创建node。

kubectl apply -f limit-pod.yaml

等待Pod创建成功后,执行以下命令进入Pod,在/cache文件夹内创建一个2G的文件。

kubectl exec -it em2 /bin/sh
cd /cache
dd if=/dev/zero of=/cache/test2g bs=1M count=2048
exit

如下图所示:

图 65

等待配置生效,查看容器状态,因超出限制的1G,容器状态为Error。

kubectl get pod

如下图所示:

图 66

4.3.使用hostPath

在CCE节点上执行以下命令,创建一个文件夹,用于挂载给Pod。

说明:请使用云服务器cce01-node1的私网地址替换命令中的【cce01-node1- IP】。

ssh cce01-node1-IP
mkdir /testdir
exit

参照3.1步骤配置文件创建操作,创建用于hostPath Pod的yaml(挂载给Pod的目录地址为主机上存在的文件夹)。

vim hostPath-pod.yaml

按“i”键进行编辑,内容如下:

apiVersion: v1
kind: Pod
metadata:
  name: hppod
spec:
  containers:
  - image: ubuntu
    name: hp-container
    volumeMounts:
    - mountPath: /hp-dir
      name: hp-volume
    args:
    - /bin/sh
    - -c
    - sleep 30000
  volumes:
  - name: hp-volume
    hostPath:
      path: /testdir
      type: Directory

保存完成后部署节点。

kubectl apply -f hostPath-pod.yaml

查看部署成功的Pod。

kubectl get pod
图 67

进入Pod,在挂载hostPath的文件夹内写入一个文件。

kubectl exec -it hppod /bin/sh
cd /hp-dir
cat >hello2 <<EOF
hello
again
EOF
exit

如下图所示:

图 68

进入对应节点的对应目录,查看该文件是否存在。

说明:请使用云服务器cce01-node1的私网地址替换命令中的【cce01-node1- IP】。

ssh cce01-node1-IP
cd /testdir && ls
cat hello2

结果如下图所示:

图 69

退出云容器引擎CCE 节点,删除Pod。

exit
kubectl delete pod hppod

重新进入云容器引擎CCE 节点,查看该文件在CCE节点上是否仍然存在。

说明:请使用云服务器cce01-node1的私网地址替换命令中的【cce01-node1- IP】。

ssh cce01-node1- IP
cat /testdir/hello2
exit

可以看到,文件没有被删除,如下图所示:

图 70

4.4.PV和PVC

首先创建SFS Turbo文件系统,在控制台服务列表找到存储类服务中的“弹性文件服务SFS”并点击。

图 71

在SFS Turbo页面,点击“创建”。

图 72

文件系统配置参数如下:

计费模式:按需计费

区域:华北-北京四

文件系统类型:选择最小规格即可

网络:默认已有

安全组:默认已有

名称:sfs-turbo-k8s

其余参数保持默认,配置完成后,点击右下角“立即创建”,等待创建完成。

图 73

切换至实验操作桌面浏览器云容器引擎CCE控制台页面,点击“存储”界面点击“创建存储卷声明”按钮。

图 74

在创建存储卷声明页面配置以下参数,其他保持默认:

① 存储卷声明类型:极速文件存储

② PVC名称:cce-efs-import-mypvc

③创建方式:新建存储卷

④ 极速文件存储:选择默认

⑤ PV名称:sfs-turbo-k8s

然后点击“创建按钮”。

图 75

创建成功如下显示:

图 76

执行以下命令查看已绑定的PV和PVC状态。

kubectl get pv
kubectl get pvc

可看到预置环境预置的“sfs-turbo-k8s”的PV以及名为“cce-efs-import-mypvc”的PVC状态的都是Bound,如下图所示:

图 77

4.5.创建Pod使用PVC

参照3.1步骤配置文件创建操作,创建Pod的yaml。

vim testpod.yaml

按“i”键进行编辑,内容如下:

配置中“claimName”中“cce-efs-import-mypvc”是之前在极速文件存储卷中导入的PVC名称。

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: pvctest
  name: pvcpod
spec:
  containers:
  - name: busybox
    args:
    - /bin/sh
    - -c
    - sleep 30000;
    image: busybox
    volumeMounts:
    - mountPath: /pvcdir
      name: pvc-volume
  volumes:
    - name: pvc-volume
      persistentVolumeClaim:
        claimName: cce-efs-import-mypvc

保存配置完成后,执行部署。

kubectl apply -f testpod.yaml

等待片刻部署成功后,进入Pod写入文件。

执行命令“kubectl get pod |grep pvcpod”可以查看Pod创建状态。

kubectl exec -it pvcpod /bin/sh
cd /pvcdir
echo "hello pvc" > hello
exit

如下图所示:

图 78

在云容器引擎CCE节点“cce01-node1”对应的SFS目录中,查看是否存在“hello”文件。

说明:请使用云服务器cce01-node1的私网地址替换命令中的【cce01-node1- IP】。

ssh cce01-node1-IP

执行以下命令查看挂载路径。

df -h | grep sfs

进入挂载路径查看文件是否存在。

说明:请使用查看到的挂载路径替换命令中的“mount-directory”。

cd mount-directory

进入成功如下图所示:

图 79

执行以下命令查看并删除文件。

cat hello
rm -f  hello

结果如下图所示:

图 80

退出节点并删除Pod及PVC释放资源。

exit
kubectl delete pod pvcpod
kubectl delete pvc cce-efs-import-mypvc

删除成功如下图所示:

图 81

可切换至【实验操作桌面】浏览器,云容器引擎CCE “资源管理”->“存储管理”,刷新“极速文件存储卷”页面,可以看到cce-efs-import-mypvc已经被删除。

5.有状态负载StatefulSet

5.1.创建headless 服务

通过headless service,可以使得StatefulSet 里面的 Pod 有独立的网络标识(hostname)。首先仿照上面操作步骤编写配置文件编写headless服务的yaml文件。

cd /labfile
mkdir ./statefile && cd ./statefile
vim headless-service.yaml

按“i”键进行编辑,内容如下:

apiVersion: v1
kind: Service
metadata:
  name: headless
spec:
  ports:
  - name: tomcat-service-port
    port: 80
    targetPort: 8080
  clusterIP: None
  selector:
    app: tomcat

保存完成后,创建headless 服务并查看。

kubectl create -f headless-service.yaml
kubectl get svc

执行成功如下图所示:

图 82

5.2.部署有状态负载StatefulSet

仿照4.4步骤绑定PVC,切换至实验操作桌面浏览器云容器引擎CCE控制台页面,在左边标签栏点击“存储”标签,创建存储卷声明,此处PVC名字改为“cce-efs-import-sts”,急速文件存储选择新建存储卷,选择上面创建的"sfs-tutbo-k8s",pv名字改为“cce-efs-import-sts”点击“确定”完成创建,如下图所示:

图 83

仿照上面步骤编写配置文件操作,编写tomcat的StatefulSet配置文件文件,并添加存储卷。

vim tomcat-statefulset.yaml

按“i”键进行编辑,内容如下:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: tomcat-statefulset
spec:
  serviceName: tomcat-headless
  replicas: 3
  selector:
    matchLabels:
      app: tomcat
  template:
    metadata:
      labels:
        app: tomcat
    spec:
      containers:
      - name: tomcat
        image: tomcat
        ports:
        - containerPort: 8080
        volumeMounts:
        - mountPath: /webapps
          name: www-storage
      volumes:
      - name: www-storage
        persistentVolumeClaim:
          claimName: cce-efs-import-sts

创建StatefulSet的负载。

说明:部署配置需要拉取“tomcat”镜像,拉取时间视网络情况而定。

kubectl apply -f tomcat-statefulset.yaml

查看部署情况,可以看到如下3个pod名字,后缀分别为0、1、2,过程中,当序号为 “tomcat-statefulset-0” 的 Pod 创建完成后,开始创建序号为 1 的 Pod,当新的 PVC 也已经创建成功,紧接着是序号为 2 的 Pod。

kubectl get pod

结果如下图所示:

图 84

可以看到“tomcat-statefulset”这个服务已经ready。

kubectl get sts
图 85

切换至实验操作桌面浏览器云容器引擎CCE控制台页面,点击左边菜单栏中的“工作负载”,可以看到有状态负载 StatefulSet。

图 86

在左边标签栏展开“服务”,可查看到网络管理中headless的service。

图 87

5.3.查看Pod的DNS

headless service可以通过解析service的DNS,返回StatefulSet部署的Pod地址和DNS。

执行以下命令查看Pod 的IP信息。

kubectl get pod -o wide

如下图所示:

图 88

通过直接运行dnsutils Pod,验证service的DNS,其中--generator=run-pod/v1表示让kubectl直接创建pod, 而不需要通过RS 之类的资源来创建。此处看到这3个pod的IP对应的域名都是headless.default.svc.cluster.local。

kubectl run dnsutils --image=busybox --command -- sh -c "while true; do sleep 3600; done"

上面命令需要拉取镜像“utum/dnsutils”,部署成功时间视网络情况而定。

kubectl exec dnsutils -- nslookup headless

结果如下图所示:

图 89

5.4.有状态负载StatefulSet编排操作

进入其中一个Pod,即"tomcat-statefulset-0"中,并在pod中创建一个文件。

kubectl exec -it tomcat-statefulset-0 /bin/sh
cd /webapps
echo "hello sts" > hello.txt
exit

删除序号为0的Pod,即“tomcat-statefulset-0”,观察重建的pod实例名称是否发生变化。如下图所示,重建的Pod实例名称还是为“tomcat-statefulset-0”。

kubectl delete pod tomcat-statefulset-0
kubectl get pod

如下图所示:

图 90

重建成功后(状态为:Running),重新进入到tomcat-statefulset-0 Pod中,查看hello.txt是否还在。

kubectl exec -it tomcat-statefulset-0 /bin/bash
cd /webapps
ls && cat hello.txt
exit

可查看到hello.txt依然存在,如下图所示:

图 91

至此实验全部完成。