注意:进入实验环境后系统会自动预置环境,显示“资源准备中,预计需要1~2分钟,请耐心等待”,实验环境预置成功后显示如下。
1. 预置实验环境需几分钟,成功后将会创建本实验所需的云资源(例如VPC、安全组或云服务器)。
2. 如有预置的 ECS 资源,其用户、密码信息可点击实验操作桌面下方按钮查看。
进入【实验操作桌面】,点击【一键登录】,可自动登录并进入华为云控制台页面。
注意:进入华为云控制台后,请确保右上角的实验账号与手册左上角提供的账号信息一致,切勿使用您自己的华为云账号登录。
切换到“操作前提:登录华为云”步骤已登录的华为云控制台界面,鼠标移动到云桌面浏览器页面中左侧菜单栏,点击“服务列表”->“容器”->“云容器引擎CCE”,进入云容器引擎CCE控制台,如下图所示:
点击“购买集群”按钮,进入云容器引擎CCE购买页面。
CCE Standard 集群,配置参数如下:
① 计费模式:按需计费
② 集群名称:cce01
③ 集群版本:v1.35 或选择其他推荐版本(本实验手册以v1.35为例)
④ 集群委托:使用已有委托,CCEAutoClusterAgency,勾选“我确认委托已授予集群所需的权限。”
⑤ 集群规模:50节点
⑥ 集群masters实例数:单实例
⑦ 虚拟私有云&默认节点子网:选择预置环境预置的VPC和子网
⑧ 节点默认安全组:保持默认
⑨ 容器网络模型&容器网段:容器隧道网络 ,自动设置网段
⑩ 服务转发模式:iptables
其它参数默认,如下图所示:
点击“下一步:插件选择”,取消所有勾选插件,只默认安装基础功能插件;
点击“下一步:插件配置”,调整适配参数如下:
点击“下一步:确认配置”,在配置确认界面勾选“我已阅读并知晓上述使用说明”,点击“提交”按钮。
开始创建集群。(集群创建需要3-5min)
完成集群配置后,在集群创建界面点击“创建节点”。
进入创建节点界面。在“创建节点”步骤中,除配置如下参数外,其它默认:
节点配置
① 计费模式:按需计费
② 可用区:随机分配
③ 节点类型:弹性云服务器-虚拟机
④ 容器引擎:Containerd
⑤ 节点规格:c7.xlarge.2 4核|8GB(如此规格售罄请选择其他4核|8GB的规格)
① 操作系统:公共镜像 Huawei Cloud EulerOS 2.0
② 节点名称:cce01-node1
③ 登录方式:选择“密码”:输入自己想要设置的密码
存储配置
存储配置:保持默认。
网络配置
① 虚拟私有云:保持默认
② 节点子网:点击下拉箭头选择默认
③ 节点IP:自动分配
④ 弹性公网IP:自动创建
⑤ 规格:全动态BGP
⑥ 计费方式:按带宽计费
⑦ 带宽:5Mbit/s
其它参数默认,如下图所示:
点击“ 下一步规格确认”
在确认界面勾选“我已阅读并知晓上述使用说明”,点击提交按钮,开始创建节点。
在节点管理界面可以看到节点正在创建中。
鼠标移动到云桌面浏览器页面中左侧菜单栏,点击“服务列表”->“计算”->“弹性云服务器ECS”进入服务器列表,找到系统创建的弹性云服务器“ecs-k8s”。
① 双击实验操作桌面的“Xfce终端”打开Terminal,输入以下命令登录云服务器,请使用弹性云服务器ECS ecs-k8s的公网IP替换命令中的【EIP】:
ssh root@EIP
② 接受秘钥输入“yes”,回车;
③ 输入密码:使用预置环境信息中云服务器名称为ecs-k8s的用户密码(输入密码时,命令行窗口不会显示密码,输完之后直接键入回车)。成功登录云服务器之后如下图所示:
实验过程中请勿关闭该Terminal窗口,否则需要重复此步骤重新建立连接;
后续操作请保持Terminal窗口与云服务器的链接状态,以确保所有操作都执行在云服务器上。
①下载kubectl:在CCE集群管理界面点击集群名称:
在集群信息界面下拉到下图位置,点击kubectl后面的“配置”:
首先下载kubectl,点击图示链接:
来到kubernetes版本发布页面:
本次安装版本为v1.28,点击CHANGELOG-1.28.md
下拉至v1.28.8,点击Downloads for v1.28.8
下拉,选择Client binaries中的 kubernetes-client-linux-amd64.tar.gz,点击右键,复制链接地址,记录此处链接为:https://dl.k8s.io/v1.28.8/kubernetes-client-linux-amd64.tar.gz
② 接下来下载kubectl配置文件。在步骤②页面中找到下载kubectl配置文件,点击”此处“下载kubectl配置文件到实验的操作桌面。
下载完成后,新打开一个“Xfce终端”,执行如下命令,上传配置文件到弹性云服务器ECS: 说明:请使用弹性云服务器ECS ecs-k8s的公网IP替换命令中的【EIP】,上传过程中需要输入云服务器ECS ecs-k8s的密码。
scp /home/user/Downloads/cce01-kubeconfig.yaml root@EIP:/root
上传成功如下图所示:
在登录弹性云服务器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
ls
tar -zxvf kubernetes-client-linux-amd64.tar.gz
解压完成:
执行以下命令复制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
执行成功如下图所示:
执行以下命令验证kubectl安装结果。
kubectl cluster-info
验证结果如下图所示:
执行以下命令创建一个Pod。
cd ~ && kubectl run nginx --image=nginx --port 80
创建成功如下图所示:
执行以下命令查看该Pod的IP地址及所处节点。
注意:因环境差异,不同用户看到的Pod IP地址不同,需要记录自己所看到的Pod IP地址。
kubectl get pods -o wide
Pod IP如下图所示:
从云容器引擎CCE节点访问该Pod(实际IP以实际输出为准)。
使用ssh命令登录云容器引擎CCE节点,命令中【cce01-node1- IP】为cce01-node1私网IP地址。
cce01-node1私网IP地址位置参考如下:
请手动打开cce01-node1对应的安全组的22端口。
请使用云服务器cce01-node1的私网地址替换命令中的【cce01-node1- IP】。
ssh cce01-node1-IP
执行以下命令访问刚刚创建的Pod。
请使用上面查看的nginx Pod的IP替换命令中的【Pod-IP】。
curl Pod-IP
执行成功说明Node与Pod正常通信,如下图所示:
退出cce01-node1登录,执行以下命令创建一个client Pod,并进入该Pod的tty。
exit
kubectl run -it busybox --image=busybox
如下图所示:
切换至未登录弹性云服务器ECS ecs-k8s的Terminal窗口,参照1.1步骤操作进行登录,登录成功后执行以下命令查看Pod busybox 及 Pod nginx 的IP。
kubectl get pods -o wide
切换至已进入 busybox Pod的Terminal窗口,执行以下命令做连通性测试,从busybox Pod 访问nginx Pod服务。
说明:请使用Pod nginx IP替换命令中【pod-nginx-ip】。
telnet pod-nginx-ip 80
执行成功如下图所示:
Ctrl + C,执行以下命令退出busybox Pod并删除Pod资源。
exit
kubectl delete pod busybox nginx
删除成功如下图所示:
说明:删除Pod需要一定时间。
执行以下命令创建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
仿照创建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
查看service中的endpoints。
kubectl get endpoints
切换至实验操作桌面已登录弹性云服务器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
回显成功如下图所示:
退出CCE节点,删除nginx-svc 服务。
exit
kubectl delete service nginx-svc
删除成功如下图所示:
参照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
使用弹性云服务器ECS ecs-k8s访问<节点IP地址:端口>,显示“welcome to nginx!”表示成功。说明:使用cce01-node1的私网IP替换命令中的【cce01-node1-IP】。
curl cce01-node1-IP:30144
访问成功如下图所示:
参照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
进入容器成功如下图所示:
使用nslookup命令查看服务域名。
说明:使用3.2步骤查看的nginx-svc CLUSTER-IP替换命令中的【】。
nslookup <nginx-svc cluster IP>
访问成功后如下图所示,其中nginx-svc.default.svc.cluster.local为nginx-svc的完整域名。
使用wget命令通过域名访问服务。
wget nginx-svc:8080
验证成功如下图所示:
执行以下命令删除index文件并退出容器。
rm index.html exit
执行以下命令创建并切换到存储实验使用的目录。
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
如下图所示:
查看Pod所在节点,可以看到Pod运行在node01上。
kubectl get pod -o wide
登录cce01-node1节点命令行,查看运行的容器。
说明:请使用云服务器cce01-node1的私网地址替换命令中的【cce01-node1- IP】。
ssh cce01-node1-IP
登录成功后执行以下命令查看容器。
crictl ps
执行以下命令查看容器挂载的目录。
说明:用上图创建的Pod主容器CONTAINER ID 替换命令中的 container-id。
crictl inspect container-id
可以看到挂载的source目录,如下图所示:
执行以下命令切换到host_path目录。
说明:用查看到的host_path目录替换命令中的source-folder
cd source-folder
执行以下命令可查看到上面操作创建的文件及内容。
ls cat hello.file
如下图所示:
回到弹性云服务器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
结果如下图所示:
退出云容器引擎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
如下图所示:
等待配置生效,查看容器状态,因超出限制的1G,容器状态为Error。
kubectl get pod
如下图所示:
在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
进入Pod,在挂载hostPath的文件夹内写入一个文件。
kubectl exec -it hppod /bin/sh
cd /hp-dir
cat >hello2 <<EOF
hello
again
EOF
exit
如下图所示:
进入对应节点的对应目录,查看该文件是否存在。
说明:请使用云服务器cce01-node1的私网地址替换命令中的【cce01-node1- IP】。
ssh cce01-node1-IP
cd /testdir && ls
cat hello2
结果如下图所示:
退出云容器引擎CCE 节点,删除Pod。
exit
kubectl delete pod hppod
重新进入云容器引擎CCE 节点,查看该文件在CCE节点上是否仍然存在。
说明:请使用云服务器cce01-node1的私网地址替换命令中的【cce01-node1- IP】。
ssh cce01-node1- IP
cat /testdir/hello2
exit
可以看到,文件没有被删除,如下图所示:
首先创建SFS Turbo文件系统,在控制台服务列表找到存储类服务中的“弹性文件服务SFS”并点击。
在SFS Turbo页面,点击“创建”。
文件系统配置参数如下:
计费模式:按需计费
区域:华北-北京四
文件系统类型:选择最小规格即可
网络:默认已有
安全组:默认已有
名称:sfs-turbo-k8s
其余参数保持默认,配置完成后,点击右下角“立即创建”,等待创建完成。
切换至实验操作桌面浏览器云容器引擎CCE控制台页面,点击“存储”界面点击“创建存储卷声明”按钮。
在创建存储卷声明页面配置以下参数,其他保持默认:
① 存储卷声明类型:极速文件存储
② PVC名称:cce-efs-import-mypvc
③创建方式:新建存储卷
④ 极速文件存储:选择默认
⑤ PV名称:sfs-turbo-k8s
然后点击“创建按钮”。
创建成功如下显示:
执行以下命令查看已绑定的PV和PVC状态。
kubectl get pv
kubectl get pvc
可看到预置环境预置的“sfs-turbo-k8s”的PV以及名为“cce-efs-import-mypvc”的PVC状态的都是Bound,如下图所示:
参照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
如下图所示:
在云容器引擎CCE节点“cce01-node1”对应的SFS目录中,查看是否存在“hello”文件。
说明:请使用云服务器cce01-node1的私网地址替换命令中的【cce01-node1- IP】。
ssh cce01-node1-IP
执行以下命令查看挂载路径。
df -h | grep sfs
进入挂载路径查看文件是否存在。
说明:请使用查看到的挂载路径替换命令中的“mount-directory”。
cd mount-directory
进入成功如下图所示:
执行以下命令查看并删除文件。
cat hello
rm -f hello
结果如下图所示:
退出节点并删除Pod及PVC释放资源。
exit
kubectl delete pod pvcpod
kubectl delete pvc cce-efs-import-mypvc
删除成功如下图所示:
可切换至【实验操作桌面】浏览器,云容器引擎CCE “资源管理”->“存储管理”,刷新“极速文件存储卷”页面,可以看到cce-efs-import-mypvc已经被删除。
通过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
执行成功如下图所示:
仿照4.4步骤绑定PVC,切换至实验操作桌面浏览器云容器引擎CCE控制台页面,在左边标签栏点击“存储”标签,创建存储卷声明,此处PVC名字改为“cce-efs-import-sts”,急速文件存储选择新建存储卷,选择上面创建的"sfs-tutbo-k8s",pv名字改为“cce-efs-import-sts”点击“确定”完成创建,如下图所示:
仿照上面步骤编写配置文件操作,编写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
结果如下图所示:
可以看到“tomcat-statefulset”这个服务已经ready。
kubectl get sts
切换至实验操作桌面浏览器云容器引擎CCE控制台页面,点击左边菜单栏中的“工作负载”,可以看到有状态负载 StatefulSet。
在左边标签栏展开“服务”,可查看到网络管理中headless的service。
headless service可以通过解析service的DNS,返回StatefulSet部署的Pod地址和DNS。
执行以下命令查看Pod 的IP信息。
kubectl get pod -o wide
如下图所示:
通过直接运行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
结果如下图所示:
进入其中一个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
如下图所示:
重建成功后(状态为:Running),重新进入到tomcat-statefulset-0 Pod中,查看hello.txt是否还在。
kubectl exec -it tomcat-statefulset-0 /bin/bash
cd /webapps
ls && cat hello.txt
exit
可查看到hello.txt依然存在,如下图所示:
至此实验全部完成。