总字符数: 42.50K
代码: 16.25K, 文本: 5.96K
预计阅读时间: 1.61 小时
课程介绍
Kubernetes(K8s)一个用于容器集群的自动化部署、扩容以及运维的开源平台.通过Kubernetes,你可以快速有效地响应用户需求;快速而有预期地部署你的应用;极速地扩展你的应用;无缝对接新应用功能;节省资源,优化硬件资源的使用.为容器编排管理提供了完整的开源方案.
Kubernetes解决了什么问题?
- 服务器环境
- 服务器资源管理
- 服务容灾恢复
- 硬件资源利用
- 服务资源创建
- 可视化管理
- 服务资源监控
- 资源整合管理
Kubernetes在容器编排可谓是做到了淋漓尽致,解决了之前的种种痛点,但是学习成本也相对较高,需要结合一定的实践,踩一定的坑才能形成自己的理解.
目标
- 了解什么是K8s,为什么世界需要它,K8s的工程师又为什么这么抢手.
- K8s企业环境部署捷径,多Master/node快速部署.
- 基于Kubernetes集群管理,kubeadm,kubectl等常见指令使用.
- 基于Kubernetes快速启动集群Web应用.
一、Kubernetes概述
什么是K8s
Kubernetes(K8s)是Google在2014年发布的一个开源项目.
据说Google的数据中心里运行着20多亿个容器,而且Google十年多前就开始使用容器技术.
最初,Google开发了一个叫Borg的系统(现在命名为Omega)来调度如此庞大数量的容器和工作负载.在积累了这么多年的经验后,Google决定重写这个容器管理系统,并将其贡献到开源社区,让全世界都能受益.
这个项目就是Kubernetes.简单地讲,Kubernetes是Google Omega的开源版本.
从2014年第一个版本发布以来,Kubernetes迅速获得开源社区的追捧,包括Red Hat、VMware、Canonical在内的很多有影响力的公司加入到开发和推广的阵营.目前Kubernetes已经成为发展最快、市场占有率最高的容器编排引擎产品.


Kubernetes解决了什么问题
- 通过 Kubernetes,分布式系统工具将拥有网络效应.每当人们为 Kubernetes 制作出的新的工具,都会让所有其他工具更完善.因此,这进一步巩固了 Kubernetes 的标准地位.
- 云提供商并非可替换的商品.不同的云提供的服务会变得越来越独特和不同.如果可以访问不同的云提供商提供的不同服务,那么企业将因此受益.
- 当多节点应用与单节点应用一样可靠时,我们将看到定价模型的变化.
- 这就是为什么我会被 Kubernetes 洗脑的原因,它是跨越异构系统的一个标准层.
- 将来,我们会像讨论编译器和操作系统内核一样讨论 Kubernetes. Kubernetes 将会是低层级的管路系统,而不在普通应用开发人员的视野之内.
Kubernetes 已成为部署分布式应用的标准方式.在不远的将来,任何新成立的互联网公司都将用到 Kubernetes,无论其是否意识到这点.许多旧应用也正在迁移到 Kubernetes.
起因:Docker

单一稳定的一体化模型

微型化的应用部署模型
(微服务、分布式、集群、高可用、负载均衡…)

容器编排?是需要标准的?
如此多的docker该如何管理(通信、负载均衡、资源共享管理、容灾、监控、健康检查….)?
- Mesos

- docker swarm

- kubernetes

自2016年中,K8s表现出明显优势.

二、环境
部署软件环境版本
操作系统: Ubuntu 18.10
(本教程采用server版本)
Docker:docker-ce 18.06
Kubernetes: K8s 1.21.8
Ubuntu搭建研发环境
我们直接下载Unbuntu18.10-server版本,server版本的好处是没有Desktop,可以节省资源.
Ubuntu安装过程
创建虚拟机
在VMWare 中启动安装虚拟过程
创建新的虚拟机
选择自定义安装
为此虚拟机选择操作系统
Linux Ubuntu 64位
命名为Master
自定设置 存储为UbuntuMaster 2CPU 2048MB 40GB硬盘
使用ISO镜像
建议移除声卡和打印机
图形界面安装方式
选择英文语言
英文键盘
设置您的用户名和密码,下文使用
killer
killer
系统服务安装清单,一般都是直接选择Done 回车,进入安装模式.

开始安装过程
安装结束后点击重启
Reboot Now
准备操作
1 | # 修改root密码 |

1 | # 修改主机名称 |

1 | # 配置静态IP(永久有效)(NAT模式) |

1 | # 换源 |

三、Docker-CE安装及配置
基础准备
- Docker 要求 Ubuntu 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的 Ubuntu 版本是否支持 Docker.
1 | sudo uname -r |
- 安装
curl
1 | sudo apt-get update && sudo apt-get install -y curl telnet wget man apt-transport-https ca-certificates software-properties-common vim |
在线安装Docker-ce
1 | # 添加USTC镜像源的GPG密钥 |
启动Docker-ce
1 | # 开机并启动docker |

申请阿里云镜像加速器
申请步骤如下
在阿里云注册自己账户
找到容器镜像服务,参考网址如下
点开左侧菜单镜像中心->镜像加速器
右侧加速器地址,即使私人专属的镜像加速器地址,点击复制

Docker配置国内镜像加速器
目的 : 为了下载docker镜像更快
您可以通过修改daemon
配置文件/etc/docker/daemon.json
来使用加速器.
创建/etc/docker/daemon.json
文件,内容如下:
1 | sudo mkdir -p /etc/docker |

四、Kubernetes 安装及部署
K8s安装环境准备
配置并安装K8s国内源
创建配置文件
sudo touch /etc/apt/sources.list.d/kubernetes.list
添加写权限
1
sudo chmod 666 /etc/apt/sources.list.d/kubernetes.list
再添加,内容如下:
1
sudo echo "deb http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial main" >> /etc/apt/sources.list.d/kubernetes.list
执行
sudo apt update
更新操作系统源,开始会遇见如下错误1
2
3
4
5
6
7sudo apt update
W: GPG error: http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY B53DC80D13EDEF05
E: The repository 'http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial InRelease' is not signed.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.其中:
1
The following signatures couldn't be verified because the public key is not available: NO_PUBKEY B53DC80D13EDEF05
签名认证失败,需要重新生成.记住上面的NO_PUBKEY
B53DC80D13EDEF05
添加认证key
运行如下命令,添加错误中对应的key(错误中NO_PUBKEY后面的key的后8位)
1
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 13EDEF05
接着运行如下命令说明成功,之后进行安装:
1
sudo gpg --export --armor 13EDEF05 | sudo apt-key add -
再次重新
sudo apt update
更新系统下载源数据列表
禁止基础设施
1 | # 禁止防火墙 |
K8s系统网络配置
1 | # 配置内核参数,将桥接的IPv4流量传递到iptables的链 |
安装K8s
安装Kubernetes 目前安装版本
v1.21.8
1
sudo apt update && sudo apt-get install -y kubelet=1.21.8-00 kubeadm=1.21.8-00 kubectl=1.21.8-00
设置为开机重启
1
2# 如果是单机部署k8s就需要执行:kubeadm init
sudo systemctl enable kubelet && sudo systemctl start kubelet
验证K8s
1 | # 查看当前K8s版本 |
请将Ubuntu关机,并快照
五、创建企业Kubernetes多主机集群环境
创建两个节点(两个虚拟机)
在VMWare中创建完整克隆,分别命名为
UbuntuNode1
和UbuntuNode2
选择
Master
虚拟机快照,点击第一份快照,选择克隆选择完整克隆
分别对两个完整克隆的虚拟机进行如下操作,修改主机名称和静态IP
UbuntuNode1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23# 配置静态IP(永久有效)(NAT模式)
sudo vim /etc/netplan/01-netcfg.yaml
# This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
version: 2
renderer: networkd
ethernets:
ens33:
addresses: [192.168.64.121/24]
dhcp4: false
gateway4: 192.168.64.2
nameservers:
addresses: [192.168.64.2]
optional: true
# 保存更改后,应用新的网络配置.可以使用以下命令来应用配置更改:
sudo netplan apply
# 修改主机名
sudo hostnamectl set-hostname node1
# su 用户名
su killerUbuntuNode2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23# 配置静态IP(永久有效)(NAT模式)
sudo vim /etc/netplan/01-netcfg.yaml
# This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
version: 2
renderer: networkd
ethernets:
ens33:
addresses: [192.168.64.122/24]
dhcp4: false
gateway4: 192.168.64.2
nameservers:
addresses: [192.168.64.2]
optional: true
# 保存更改后,应用新的网络配置.可以使用以下命令来应用配置更改:
sudo netplan apply
# 修改主机名
sudo hostnamectl set-hostname node2
# su 用户名
su killer
Master和Node基础配置
修改hosts文件
注意:(Master、Node1、Node2都需要配置)
使用root用户登录
打开hosts文件
sudo vim /etc/hosts
输入如下内容
1
2
3192.168.64.120 master
192.168.64.121 node1
192.168.64.122 node2重启机器
sudo shutdown -r now
配置Master节点
创建工作目录
1 | mkdir /home/killer/working |

创建kubeadm.conf配置文件
创建K8s的管理工具
kubeadm
对应的配置文件,候选操作在home/killer/working/
目录下1
2
3# 使用kubeadm配置文件,通过在配置文件中指定docker仓库地址,便于内网快速部署.
# 生成配置文件
sudo kubeadm config print init-defaults --component-configs KubeletConfiguration > kubeadm.conf修改
kubeadm.conf
中的如下两项:1
2
3
4
5
6# - imageRepository
# - kubernetesVersion
vi kubeadm.conf
# 修改 imageRepository: K8s.gcr.io
# 改为 registry.aliyuncs.com/google_containers
imageRepository:registry.aliyuncs.com/google_containers修改
kubeadm.conf
中的API服务器地址,后面会频繁使用这个地址.1
2
3
4# localAPIEndpoint:
localAPIEndpoint:
advertiseAddress: 192.168.64.120
bindPort: 6443注意:
192.168.64.120
是master主机的ip地址配置子网网络
1
2
3
4
5networking:
dnsDomain: cluster.local
podSubnet: 10.244.0.0/16
serviceSubnet: 10.96.0.0/12
scheduler: {}这里的
10.244.0.0/16
和10.96.0.0/12
分别是K8s内部pods和services的子网网络,最好使用这个地址,后续flannel网络需要用到.
拉取K8s必备的模块镜像
查看一下都需要哪些镜像文件需要拉取
1
2
3
4
5
6
7
8
9sudo kubeadm config images list --config ./kubeadm.conf
# registry.cn-beijing.aliyuncs.com/imcto/kube-apiserver:v1.21.0
# registry.cn-beijing.aliyuncs.com/imcto/kube-controller-manager:v1.21.0
# registry.cn-beijing.aliyuncs.com/imcto/kube-scheduler:v1.21.0
# registry.cn-beijing.aliyuncs.com/imcto/kube-proxy:v1.21.0
# registry.cn-beijing.aliyuncs.com/imcto/pause:3.4.1
# registry.cn-beijing.aliyuncs.com/imcto/etcd:3.4.13-0
# registry.cn-beijing.aliyuncs.com/imcto/coredns/coredns:v1.8.0拉取镜像
1
2
3
4
5
6
7
8
9
10
11# 下载全部当前版本的K8s所关联的镜像
sudo kubeadm config images pull --config ./kubeadm.conf
# 对images重命名 这里要注意重命名的版本号有的是带v的,有的是不带的 注意看清楚
sudo docker tag registry.aliyuncs.com/google_containers/kube-apiserver:v1.21.0 registry.K8s.io/kube-apiserver:v1.21.0
sudo docker tag registry.aliyuncs.com/google_containers/kube-controller-manager:v1.21.0 registry.K8s.io/kube-controller-manager:v1.21.0
sudo docker tag registry.aliyuncs.com/google_containers/kube-scheduler:v1.21.0 registry.K8s.io/kube-scheduler:v1.21.0
sudo docker tag registry.aliyuncs.com/google_containers/kube-proxy:v1.21.0 registry.K8s.io/kube-proxy:v1.21.0
sudo docker tag registry.aliyuncs.com/google_containers/pause:3.4.1 registry.K8s.io/pause:3.4.1
sudo docker tag registry.aliyuncs.com/google_containers/etcd:3.4.13-0 registry.K8s.io/etcd:3.4.13-0
sudo docker tag registry.aliyuncs.com/google_containers/coredns:v1.8.0 registry.K8s.io/coredns/coredns:v1.8.0

初始化kubernetes环境
1 | # 初始化并且启动 |
更多kubeadm配置文件参数详见
1 | sudo kubeadm config print-defaults |
K8s启动成功输出内容较多,但是记住末尾的内容
1 |
|
按照官方提示,执行以下操作.
执行如下命令
1
2
3mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config创建系统服务并启动
1
2
3
4# 启动kubelet 设置为开机自启动
sudo systemctl enable kubelet
# 启动K8s服务程序
sudo systemctl start kubelet
验证kubernetes启动结果
验证输入,注意显示master状态是
NotReady
,证明初始化服务器成功1
2
3kubectl get nodes
# NAME STATUS ROLES AGE VERSION
# node NotReady control-plane,master 86s v1.21.8注释相关信息
1
2
3
4
5
6
7
8sudo vim /etc/kubernetes/manifests/kube-controller-manager.yaml
# 注释掉第26行 #- --port=0
sudo vim /etc/kubernetes/manifests/kube-scheduler.yaml
# 注释到第19行 #- --port=0
# 重启kubelet
sudo systemctl restart kubelet.service查看当前K8s集群状态
1 | kubectl get nodes |
目前只有一个master,还没有node,而且是NotReady状态,那么我们需要将node加入到master管理的集群中来
部署集群内部通信flannel网络
1 | cd $HOME/working |
编辑这个文件,确保flannel网络是对的,找到sudo vim kube-flannel.yml
标记的内容是否正确.
1 | net-conf.json: | |
./kubeadm.conf中的podsubnet的地址要一致.
应用当前flannel配置文件
1 | sudo kubectl apply -f kube-flannel.yml |
输出结果如下
1 | namespace/kube-flannel created |
安装flannel网络后 执行kubectl get nodes
输出结果如下
1 | kubectl get nodes |
此时master已经是Ready
状态了,表示已经配置成功了,那么我们就需要配置node来加入这个集群.
配置Node
配置K8s集群的Node主机环境
启动K8s后台服务
1
2# 启动kubelet 设置为开机自启动
sudo systemctl enable kubelet将master机器的
/etc/kubernetes/admin.conf
传到到node1和node2登录
master
终端1
2
3
4# 将admin.conf传递给node1
sudo scp /etc/kubernetes/admin.conf killer@192.168.64.121:/home/killer/
# 将admin.conf传递给node2
sudo scp /etc/kubernetes/admin.conf killer@192.168.64.122:/home/killer/登录
node1
终端,创建基础kube配置文件环境1
2
3mkdir -p $HOME/.kube
sudo cp -i $HOME/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config登录
node2
终端,创建基础kube配置文件环境1
2
3mkdir -p $HOME/.kube
sudo cp -i $HOME/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/confignode1
和node2
分别连接master
加入master集群.这里用的是kubeadm join
指令1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17sudo kubeadm join 192.168.64.120:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:dc94fc0dc028e01532b82fe99ec94ad2841a6c9a8873d496714fbc3f4147fc66
# [preflight] Running pre-flight checks
# [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/
# [preflight] Reading configuration from the cluster...
# [preflight] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
# [kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml"
# [kubelet-start] Writing kubelet environment file with flags to file "/var/lib/kubelet/kubeadm-flags.env"
# [kubelet-start] Starting the kubelet
# [kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...
# This node has joined the cluster:
# * Certificate signing request was sent to apiserver and a response was received.
# * The Kubelet was informed of the new secure connection details.
# Run 'kubectl get nodes' on the control-plane to see this node join the cluster.
这里要注意,使用的hash应该是master
主机 kubeadm init
成功之后生成的hash码.
应用两个node主机分别应用flannel网络
将master
中的kube-flannel.yml
分别传递给两个node
节点.1
2
3
4#将kube-flannel.yml传递给node1
sudo scp $HOME/working/kube-flannel.yml killer@192.168.64.121:/home/killer/
#将kube-flannel.yml传递给node2
sudo scp $HOME/working/kube-flannel.yml killer@192.168.64.122:/home/killer/分别启动
flannel
网络1
killer@node1:~$ kubectl apply -f kube-flannel.yml
1
killer@node2:~$ kubectl apply -f kube-flannel.yml
查看node是否已经加入到K8s集群中(需要等一段时间才能ready)
1
2
3
4
5killer@master:~$ kubectl get nodes
# NAME STATUS ROLES AGE VERSION
# node Ready control-plane,master 87m v1.21.8
# node1 Ready <none> 3m52s v1.21.8
# node2 Ready <none> 2m46s v1.21.8
K8s 图形化管理界面
只需在
Master机器上装就可以了
Dashboard
下载yaml,并运行Dashboard
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19# 下载yaml
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml
vim recommended.yaml
# 修改kubernetes-dashboard的Service类型
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort # 新增
ports:
- port: 443
targetPort: 8443
nodePort: 30009 # 新增
selector:
k8s-app: kubernetes-dashboard部署并查看
1
2
3
4
5
6
7
8
9# 部署
kubectl apply -f recommended.yaml
# 查看是否启动成功
kubectl get pods -n kubernetes-dashboard
# NAME READY STATUS RESTARTS AGE
# dashboard-metrics-scraper-5594697f48-7r297 1/1 Running 0 4m42s
# kubernetes-dashboard-57c9bfc8c8-gvwf5 1/1 Running 0 4m42s创建账户并授权
1
2
3
4
5
6
7
8
9
10
11
12
13# 创建账号
kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard
# 授权
kubectl create clusterrolebinding dashboard-admin-rb --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin
4. 获取账户token
```bash
kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep dashboard-admin | awk '{print $1}')
# token: eyJhbGciOiJSUzI1NiIsImtpZCI6IjJtWEhoU3kwZjZzM2FkdUIwaDFwbE16Xy1YUWZGckVYOVdTdWFEWFdfMkUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZC10b2tlbi1sbnd6OSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6ImIzZTg0NGNiLWNmMWEtNGQxZC1hN2JmLTY5YzkzMzgwYWU5NCIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlcm5ldGVzLWRhc2hib2FyZDprdWJlcm5ldGVzLWRhc2hib2FyZCJ9.K78S-Q0HriBPGa4pQXQQXntLzJwj8qKbBnpOFbpIn6FkZ0TN5lt7rpJ8l1dwFdM2ijvlIvRVc6Kn65RBZml2gOugE2KkUTep6mxyxxz89vzc6WoOfv2f65fd14NWx9pDx8nuNpchOH1PCRbsgiQv36Pwo-HumDVFL30q5RKt8iylt8AacFGLmgdMJbZlZ6q6FR7gcX7QdqmvlNySgyPhVtHrxZMlahbbzarl2Dulq6bREBhAuoWI_4okFMlk0fDKS6GoM582DoGQPUnQbPsyupvy9EBozKS7D5fFoPzN5fZOMYzAc9fCbKRjPq5w9IDpKYsBzdpYaL9qSO5IUPe7yg通过浏览器访问Dashboard的UI并在登录页面上输入上面的token
1
2# 注意是https协议,Chrome访问不了,可以用火狐
https://192.168.64.120:30009/等你们完成了应用实例,上图中的
pods
就会出现
Kuboard
1 | # Master上执行 |
- 点击添加集群,输入名称信息,按照图中选择,点击确认
- 复制粘贴下载 yaml 文件命令,在
master
执行,即可完成导入等待一会!!!

六、应用实例
工作目录:/home/killer/working
创建MySQL实例
定义描述文件
1 | sudo tee mysql-rc.yaml <<-'EOF' |
加载ReplicationController副本控制器描述文件
创建好mysql-rc.yaml后,在master节点使用kubectl命令将它发布到K8s集群中.
1 | # 创建 |
查看启动状态
通过查看当前的pods
列表,是否已经启动成功
1 | kubectl get pods --all-namespaces |

创建Tomcat实例
定义描述文件
1 | sudo tee myweb-rc.yaml <<-'EOF' |
1 | apiVersion: v1 # 使用的 Kubernetes API 版本为 v1 |
加载RC副本描述文件
1 | kubectl create -f myweb-rc.yaml |
注意mysql实例 状态 Running
myweb实例状态 ContainerCreating
过几分钟myweb实例状态变成 Running
创建服务副本
在master服务器
1 | sudo tee myweb-svc.yaml <<-'EOF' |
1 | - apiVersion: v1 # 指定使用的 Kubernetes API 版本. |
部署服务
1 | kubectl create -f myweb-svc.yaml |
验证
1 | kubectl get pods |
1 | kubectl get service |
已经看到已经有一个myweb
服务已经启动
1 | kubectl describe service myweb |
1 | Name: myweb # Service 的名称为 "myweb" |
验证端口号
1 | sudo netstat -tlp|grep 30001 |
我们可以打开浏览器,输入master/node1/node2任何一个地址+30001端口都可以,访问tomcat服务.
1 | http://192.168.64.120:30001 |



创建自定义的Beego 应用Web程序集群
初始化Mysql
找到我们之前创建好的Mysql的pod的
NAME
1
2
3
4
5
6
7
8
9
10kubectl get pods
# NAME READY STATUS RESTARTS AGE
# mysql-gxmhx 1/1 Running 0 9m50s
# mysql-sncqg 1/1 Running 0 9m50s
# mysql-xqwbt 1/1 Running 0 9m50s
# myweb-2c756 1/1 Running 0 12m
# myweb-8757q 1/1 Running 0 12m
# myweb-g4dpr 1/1 Running 0 12m
# myweb-mfcdk 1/1 Running 0 12m
# myweb-xr4vq 1/1 Running 0 12m查看当前pod的详细信息
1
kubectl describe pod mysql-mvx5c
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52Name: mysql-mvx5c # Pod 的名称为 "mysql-mvx5c"
Namespace: default # Pod 所在的命名空间为 "default"
Priority: 0 # Pod 的优先级为 0
Node: node1/192.168.64.121 # Pod 分配到的节点为 "node1",节点的 IP 地址为 "192.168.64.121"
Start Time: Thu, 13 Jul 2023 19:26:56 +0800 # Pod 启动的时间为 "2023年7月13日19:26:56"
Labels: app=mysql # Pod 的标签为 "app=mysql"
Annotations: cni.projectcalico.org/podIP: 10.244.166.129/32 # Pod 的注释信息,表示分配给 Pod 的 IP 地址
cni.projectcalico.org/podIPs: 10.244.166.129/32 # Pod 的注释信息,表示分配给 Pod 的 IP 地址
Status: Running # Pod 的状态为运行中
IP: 10.244.166.129 # Pod 的 IP 地址为 10.244.166.129
IPs:
IP: 10.244.166.129 # Pod 的 IP 地址为 10.244.166.129
Controlled By: ReplicationController/mysql # 控制该 Pod 的 ReplicationController 的名称为 "mysql"
Containers:
mysql:
Container ID: docker://9a9d27ad8b79ebb51439d315425a24da2994527783bb355bfaa2446d4d100099
# 容器的 ID
Image: hub.c.163.com/library/mysql # 容器使用的镜像为 "hub.c.163.com/library/mysql"
Image ID: docker-pullable://hub.c.163.com/library/mysql@sha256:b2bce1a792237ac5df78877d583f34b09ab023a77130921a6bcce67ce2d24ff0
# 镜像的 ID
Port: 3306/TCP # 容器监听的端口为 3306/TCP
Host Port: 0/TCP # 宿主机映射的端口为 0/TCP(随机端口)
State: Running # 容器的状态为运行中
Started: Thu, 13 Jul 2023 19:27:28 +0800 # 容器启动的时间为 "2023年7月13日19:27:28"
Ready: True # 容器是否就绪为 True
Restart Count: 0 # 容器重启的次数为 0
Environment:
MYSQL_ROOT_PASSWORD: 123456 # 容器环境变量 MYSQL_ROOT_PASSWORD 的值为 "123456"
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from kube-api-access-qt6gb (ro)
# 挂载到容器的目录"/var/run/secrets/kubernetes.io/serviceaccount",来源为名为 "kube-api-access-qt6gb" 的卷
Conditions:
Type Status
Initialized True # Pod 初始化状态为 True
Ready True # Pod 就绪状态为 True
ContainersReady True # 所有容器就绪状态为 True
PodScheduled True # Pod 被成功调度到节点上
Volumes:
kube-api-access-qt6gb:
Type: Projected (a volume that contains injected data from multiple sources)
# 卷的类型为 Projected,用于存储从多个来源注入的数据
TokenExpirationSeconds: 3607 # 令牌过期时间为 3607 秒
ConfigMapName: kube-root-ca.crt # 关联的 ConfigMap 的名称为 "kube-root-ca.crt"
ConfigMapOptional: <nil> # ConfigMap 可选关联为 nil
DownwardAPI: true # 向容器提供自身的相关信息(如标签、注解等)
QoS Class: BestEffort # Pod 的 QoS 类型为 BestEffort
Node-Selectors: <none> # 没有指定节点选择器
Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s
# 对于节点的 "not-ready" 状态,允许 Pod 在 300 秒内不可执行操作
node.kubernetes.io/unreachable:NoExecute op=Exists for 300s
# 对于节点的 "unreachable" 状态,允许 Pod 在 300 秒内不可执行操作
Events: <none> # 相关事件信息(无)得到Mysql在Subnet内网的IP地址
10.244.166.129
和登录密码1
2
3
4IP: 10.244.166.129
...
Environment:
MYSQL_ROOT_PASSWORD: 123456登录Mysql实例,创建数据库
1
kubectl exec -it mysql-mvx5c -- bash
1
2
3
4
5
6
7
8
9
10
11
12
root@mysql-mvx5c:/# mysql -u root --password=123456 --default-character-set=utf8
# 创建数据库,注意大小写
CREATE DATABASE IF NOT EXISTS newsWeb default charset utf8 COLLATE utf8_general_ci;
# 使用数据库
use newsWeb
# 退出数据库及docker
exit
exit

下载自定义的Beego-Docker 镜像
1 | sudo docker pull registry.cn-shanghai.aliyuncs.com/itcast-golang/beego-microservices:v4 |
创建Beego的RC副本文件
1 | sudo tee golang-beego.yaml <<-'EOF' |
这里要注意,里面的Mysql环境变量IP、端口、数据库用户名密码等,都是我们上面实例获取到的.
这里实际上是在我们创建一个pods容器的时候,指定的一些环境变量.然后Beego的应用程序会从系统中这些环境变量去取数据.
目前建立了NodePort端口映射,BeegoWeb应用在内网的端口是8080,对外的映射端口是30080.那么30080就是我们外网可以访问的端口号.
装载RC副本文件,创建Beego集群实例
1 | kubectl apply -f golang-beego.yaml |
查看Beego的web程序pods是否已经正常启动
1 | kubectl get pods |
也可以查看Beego程序的pods的正常输出日志
1 | kubectl logs beego-9rczj |
进入其中一个Beego容器,查看环境变量是否和我们配置的一致
1 | kubectl exec -it beego-9rczj -- sh |
验证集群是否成功
- 注册界面:http://192.168.64.121:30080/register 自己注册,后面才能登录


- 后端界面

课后任务:使用K8s跑一个个人博客或者论坛
七、K8s架构图
