环境准备

节点规划

集群节点数要求不低于两台,节点规划见表1-1。

表1-1 节点规划

IP 主机名 节点
10.24.2.10 Master Kubernetes集群master节点、Harbor仓库节点
10.24.2.11 Worker Kubernetes集群node节点

基础环境配置

将提供的安装包chinaskills_cloud_paas_v2.0.iso下载至master节点/root目录,并解压到/opt目录:

1
2
3
[root@localhost ~]# mount -o loop chinaskills_cloud_paas_v2.0.1.iso /mnt/
[root@localhost ~]# cp -rfv /mnt/* /opt/
[root@localhost ~]# umount /mnt/

安装kubeeasy

kubeeasy为Kubernetes集群专业部署工具,极大的简化了部署流程。其特性如下:

  • ● 全自动化安装流程;
  • ● 支持DNS识别集群;
  • ● 支持自我修复:一切都在自动扩缩组中运行;
  • ● 支持多种操作系统(如 Debian、Ubuntu 16.04、CentOS7、RHEL等);
  • ● 支持高可用。

在master节点安装kubeeasy工具:

1
[root@localhost ~]# mv /opt/kubeeasy /usr/bin/kubeeasy

安装依赖包

此步骤主要完成docker-ce、git、unzip、vim、wget等工具的安装。

在master节点执行以下命令完成依赖包的安装:

1
2
3
4
5
[root@localhost ~]# kubeeasy install depend \
--host 10.24.2.10,10.24.2.11 \
--user root \
--password Abc@1234 \
--offline-file /opt/dependencies/base-rpms.tar.gz

参数解释如下:

  • ● –host:所有主机节点IP,如:10.24.1.2-10.24.1.10,中间用“-”隔开,表示10.24.1.2到10.24.1.10范围内的所有IP。若IP地址不连续,则列出所有节点IP,用逗号隔开,如:10.24.1.2,10.24.1.7,10.24.1.9。
  • ● –user:主机登录用户,默认为root。
  • ● –password:主机登录密码,所有节点需保持密码一致。
  • ● –offline-file:离线安装包路径。

可通过命令“tail -f /var/log/kubeinstall.log”查看安装详情或排查错误。

配置SSH免密钥

安装Kubernetes集群的时候,需要配置Kubernetes集群各节点间的免密登录,方便传输文件和通讯。

在master节点执行以下命令完成集群节点的连通性检测:

1
2
3
4
[root@localhost ~]# kubeeasy check ssh \
--host 10.24.2.10,10.24.2.11 \
--user root \
--password Abc@1234

在master节点执行以下命令完成集群所有节点间的免密钥配置:

1
2
3
4
[root@localhost ~]# kubeeasy create ssh-keygen \
--master 10.24.2.10 \
--worker 10.24.2.11 \
--user root --password Abc@1234

–mater参数后跟master节点IP,–worker参数后跟所有worker节点IP。

模块内容

部署Kubernetes集群

安装Kubernetes集群

本次安装的Kubernetes版本为v1.22.1。

在master节点执行以下命令部署Kubernetes集群:

1
2
3
4
5
6
7
[root@localhost ~]# kubeeasy install kubernetes \
--master 10.24.2.10 \
--worker 10.24.2.11 \
--user root \
--password Abc@1234 \
--version 1.22.1 \
--offline-file /opt/kubernetes.tar.gz

部分参数解释如下:

  • –master:Master节点IP。
  • –worker:Node节点IP,如有多个Node节点用逗号隔开。
  • –version:Kubernetes版本,此处只能为1.22.1。

可通过命令“tail -f /var/log/kubeinstall.log”查看安装详情或排查错误。

部署完成后查看集群状态:

1
2
3
4
5
[root@k8s-master-node1 ~]# kubectl cluster-info
Kubernetes control plane is running at https://apiserver.cluster.local:6443
CoreDNS is running at https://apiserver.cluster.local:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.

查看节点负载情况:

1
2
3
4
[root@k8s-master-node1 ~]# kubectl top nodes --use-protocol-buffers
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
k8s-master-node1 389m 4% 6926Mi 43%
k8s-worker-node1 875m 10% 3365Mi 21%

登录一道云云开发平台

在浏览器上访问一道云云开发平台(http://master_IP:30080),设置admin用户的密码(Abc@1234Abc@1234),如图1所示:

79

图1 登录一道云云开发平台

完成后进入平台页面,如图2所示:

80

图2 进入首页

基础案例

使用kubeeasy工具完成Kubernetes 1.22.1集群的搭建。然后使用nginx镜像在default命名空间下创建一个名为exam的Pod,并为该Pod设置环境变量exam,其值为2022。完成后在master节点执行kubectl cluster-info命令和kubectl exec exam – printenv命令进行验证:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# docker load < /opt/extended-images/nginx_latest.tar 
# cat pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: exam
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
env:
- name: "exam"
value: "2022"

使用命令进行创建:

1
# kubectl apply -f pod.yaml

使用命令进行验证安装的集群环境及Pod:

1
2
3
4
5
6
7
8
9
# kubectl cluster-info
Kubernetes control plane is running at https://apiserver.cluster.local:6443
CoreDNS is running at https://apiserver.cluster.local:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
To further debug and diagnose cluster problems, use 'kubectl cluster-info dump'.
# kubectl exec exam -- printenv
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=exam
exam=2022
......

部署KubeVirt集群

KubeVirt简介

根据Garnter的最新预测,到2022年将会有75%的生产应用全部跑在容器环境之上。基于这个预测,其实至少还有25%的架构由于技术原因或者是认为原因都将仍然跑在旧的架构之上,这其中虚拟机又会占据其中的大部分份额。所以在容器技术尤其是Kubernetes诞生之初,就已经有开源的社区在为如何使用Kubernetes纳管虚拟机作为一个重要的功能在开发和贡献,KubeVirt就是其中之一。

使用KubeVirt主要解决了以下两个问题:

● 从技术层面,完全的虚拟机纳管,可以完美迁移。因为内核版本过于陈旧以及语言问题,而无法迁移到容器的部分应用;

● 从管理和运维层面,符合传统的运维工作方式。以前的SSH等运维方式可以完美复用。

KubeVirt架构如图3所示:

81

图3 KubeVirt架构

KubeVirt创建虚拟机的流程如图4所示:

82

图4 KubeVirt创建虚拟机的流程

安装KubeVirt

在本次安装的KubeVirt版本为v0.47.1。

在master节点执行以下命令安装KubeVirt:

1
[root@k8s-master-node1 ~]# kubeeasy add --virt kubevirt

查看Pod:

1
2
3
4
5
6
7
8
9
10
[root@k8s-master-node1 ~]# kubectl -n kubevirt get pods
NAME READY STATUS RESTARTS AGE
virt-api-8d998846b-2xx5m 1/1 Running 0 86s
virt-api-8d998846b-tqwhq 1/1 Running 0 86s
virt-controller-76b86f6965-gz8m4 1/1 Running 0 62s
virt-controller-76b86f6965-pjjv5 1/1 Running 0 62s
virt-handler-hvf45 1/1 Running 0 62s
virt-handler-x7bvj 1/1 Running 0 62s
virt-operator-579f86869c-k9nw4 1/1 Running 0 2m22s
virt-operator-579f86869c-vtrkn 1/1 Running 0 2m22s

基本使用

创建vmi:

1
# kubectl create -f vmi.yaml

查看vmi:

1
# kubectl get vmis

删除vmi:

1
# kubectl delete vmis <vmi-name>

virtctl工具

virtctl是KubeVirt自带的类似于kubectl的命令行工具,可以直接管理虚拟机,可以控制虚拟机的start、stop、restart等。

启动虚拟机命令:

1
# virtctl start <vmi-name>

停止虚拟机命令:

1
# virtctl stop <vmi-name>

重启虚拟机命令:

1
# virtctl restart <vmi-name>

基础案例

在Kubernetes集群上完成KubeVirt虚拟化环境的安装。完成后在master节点执行kubectl -n kubevirt get deployment命令进行验证:

1
2
3
4
5
# kubectl -n kubevirt get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
virt-api 2/2 2 2 85s
virt-controller 2/2 2 2 60s
virt-operator 2/2 2 2 2m2s

部署Istio

安装Istio

本次安装的Istio版本为v1.12.0。

在master节点执行以下命令进行Istio服务网格环境的安装:

1
[root@k8s-master-node1 ~]# kubeeasy add --istio istio

查看Pod:

1
2
3
4
5
6
7
8
9
[root@k8s-master-node1 ~]# kubectl -n istio-system get pods
NAME READY STATUS RESTARTS AGE
grafana-6ccd56f4b6-twwjv 1/1 Running 0 5m15s
istio-egressgateway-7f4864f59c-nxz2l 1/1 Running 0 5m34s
istio-ingressgateway-55d9fb9f-jzhnb 1/1 Running 0 5m34s
istiod-555d47cb65-jwkgp 1/1 Running 0 5m40s
jaeger-5d44bc5c5d-h9t29 1/1 Running 0 5m15s
kiali-79b86ff5bc-v9sfk 1/1 Running 0 5m15s
prometheus-64fd8ccd65-5px64 2/2 Running 0 5m15s

查看Istio版本信息:

1
2
3
4
[root@k8s-master-node1 ~]# istioctl version
client version: 1.12.0
control plane version: 1.12.0
data plane version: 1.12.0 (2 proxies)

Istio可视化

访问Grafana(http://master_IP:33000),如图5所示:

83

图5 Grafana访问界面

访问Prometheus(http://master_IP:30090),如图6所示:

84

图6访问Prometheus

查看Targets,如图7所示:

85

图7查看Targets

访问Jaeger(http://master_IP:30686),如图所示:

86

图8访问Jaeger

访问Kiali(http://master_IP:20001),如图9所示:

87

图9访问Kiali

istioctl基本使用

istioctl用于在Istio系统中创建、列出、修改以及删除配置资源。

可用的路由和流量管理配置类型有virtualservice、gateway、destinationrule、serviceentry、httpapispec、httpapispecbinding、quotaspec、quotaspecbinding、servicerole、servicerolebinding、policy。

使用下面命令展示istioctl可以访问到的Istio配置档的名称:

1
2
3
4
5
6
7
8
9
10
# istioctl profile list
Istio configuration profiles:
default
demo
empty
external
minimal
openshift
preview
remote

展示配置档的配置信息:

1
# istioctl profile dump demo

显示配置文件的差异:

1
# istioctl profile diff default demo

可以使用proxy-status或ps命令概览服务网格:

1
# istioctl proxy-status

如果输出列表中缺少某个代理,则意味着它当前未连接到Polit实例,所以它无法接收到任何配置。此外,如果它被标记为stale,则意味着存在网络问题或者需要扩展Pilot。

istioctl允许使用proxy-config或者pc命令检索代理的配置信息。

检索特定Pod中Envoy实例的集群配置的信息:

1
# istioctl proxy-config cluster <pod-name> [flags]

检索特定Pod中Envoy实例的bootstrap配置的信息:

1
# istioctl proxy-config bootstrap <pod-name> [flags]

检索特定Pod中Envoy实例的监听器配置的信息:

1
# istioctl proxy-config listener <pod-name> [flags]

检索特定Pod中Envoy实例的路由配置的信息:

1
# istioctl proxy-config route <pod-name> [flags]

检索特定Pod中Envoy实例的endpoint配置的信息:

1
# istioctl proxy-config endpoints <pod-name> [flags]

istioctl基础案例

在Kubernetes集群上完成Istio服务网格环境的安装,然后新建命名空间exam,为该命名空间开启自动注入Sidecar:

1
2
# kubectl create namespace exam
# kubectl label namespace exam istio-injection=enabled

在master节点执行kubectl -n istio-system get all命令和kubectl get ns exam –show-labels命令进行验证:

1
2
3
4
5
6
7
8
9
10
11
12
13
# kubectl -n istio-system get all
NAME READY STATUS RESTARTS AGE
pod/grafana-6ccd56f4b6-ssmbl 1/1 Running 0 81s
pod/istio-egressgateway-7f4864f59c-qm7wn 1/1 Running 0 97s
pod/istio-ingressgateway-55d9fb9f-jd4pn 1/1 Running 0 97s
pod/istiod-555d47cb65-p5cmq 1/1 Running 0 104s
pod/jaeger-5d44bc5c5d-xqvbj 1/1 Running 0 81s
pod/kiali-9f9596d69-2wsjl 1/1 Running 0 80s
pod/prometheus-64fd8ccd65-w2zrg 2/2 Running 0 80s
......
# kubectl get ns exam --show-labels
NAME STATUS AGE LABELS
exam Active 28s istio-injection=enabled

部署Harbor仓库

Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。作为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全,提升用户使用Registry构建和运行环境传输镜像的效率。Harbor支持安装在多个Registry节点的镜像资源复制,镜像全部保存在私有Registry中,确保数据和知识产权在公司内部网络中管控。另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。

安装Harbor仓库

在master节点执行以下命令进行Harbor仓库的安装:

1
[root@k8s-master-node1 ~]# kubeeasy add --registry harbor

部署完成后查看Harbor仓库状态:

1
2
3
4
5
6
7
8
9
10
11
[root@k8s-master-node1 ~]# systemctl status harbor
● harbor.service - Harbor
Loaded: loaded (/usr/lib/systemd/system/harbor.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2021-12-06 14:34:49 CST; 30s ago
Docs: http://github.com/vmware/harbor
Main PID: 7819 (docker-compose)
Tasks: 12
Memory: 11.5M
CGroup: /system.slice/harbor.service
└─7819 /usr/local/bin/docker-compose -f /opt/harbor/docker-compose.yml up
Hint: Some lines were ellipsized, use -l to show in full.

在Web端通过http://master_ip访问Harbor,如图10所示:

88

图10 登录Harbor

使用管理员账号(admin/Harbor12345)登录Harbor,如图11所示:

89

图11 登录Harbor后页面

docker-compose和Helm安装部署

在docker-compose和Helm的安装部署嵌套在Harbor安装部署包内,安装Harbor的同时,也安装了docker-compose以及Helm。

helm常用命令

查看版本信息:

1
# helm version

查看当前安装的Charts:

1
# helm list

查询Charts:

1
# helm search <chart-name>

查看Charts状态:

1
# helm status redis

删除Charts:

1
# helm delete --purge <chart-name>

创建Charts:

1
# helm create helm_charts

测试Charts语法:

1
# helm lint

打包Charts:

1
# cd helm_charts && helm package ./

查看生成的yaml文件:

1
# helm template helm_charts-xxx.tgz

Helm基础案例

在master节点上完成Harbor镜像仓库及Helm包管理工具的部署。然后使用nginx镜像自定义一个Chart,Deployment名称为nginx,副本数为1,然后将该Chart部署到default命名空间下,Release名称为web:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
[root@k8s-master-node1 ~]# helm create mychart
Creating mychart
[root@k8s-master-node1 ~]# rm -rf mychart/templates/*
[root@k8s-master-node1 ~]# vi mychart/templates/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: nginx
name: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
containers:
- image: nginx
name: nginx
resources: {}
status: {}
[root@k8s-master-node1 ~]# helm install web mychart
NAME: web
LAST DEPLOYED: Tue Sep 13 16:23:12 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None

在master节点执行helm status web命令进行验证:

1
2
3
4
5
6
7
[root@k8s-master-node1 ~]# helm status web
NAME: web
LAST DEPLOYED: Tue Sep 13 16:23:12 2022
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None

基础运维

重置集群

若集群部署失败或出现故障,可重置集群重新部署,重置命令如下:

1
[root@k8s-master-node1 ~]# kubeeasy reset

重置完成后再次执行步骤1.1-1.2即可重新部署集群。

添加节点

在master节点执行以下命令安装依赖包:

1
2
3
4
5
[root@k8s-master-node1 ~]# kubeeasy install depend \
--host 10.24.2.12 \
--user root \
--password Abc@1234 \
--offline-file /opt/dependencies/base-rpms.tar.gz

其中10.24.2.12为新增节点的IP地址。

在master节点执行以下命令即可加入集群:

1
2
3
4
5
[root@k8s-master-node1 ~]# kubeeasy add \
--worker 10.24.2.12\
--user root \
--password Abc@1234 \
--offline-file /opt/kubernetes.tar.gz