总字符数: 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已经成为发展最快、市场占有率最高的容器编排引擎产品.
![](https://wordpress-1258894728.cos.ap-beijing.myqcloud.com/202307141033587.png)
![](https://wordpress-1258894728.cos.ap-beijing.myqcloud.com/202307141033000.png)
Kubernetes解决了什么问题
- 通过 Kubernetes,分布式系统工具将拥有网络效应.每当人们为 Kubernetes 制作出的新的工具,都会让所有其他工具更完善.因此,这进一步巩固了 Kubernetes 的标准地位.
- 云提供商并非可替换的商品.不同的云提供的服务会变得越来越独特和不同.如果可以访问不同的云提供商提供的不同服务,那么企业将因此受益.
- 当多节点应用与单节点应用一样可靠时,我们将看到定价模型的变化.
- 这就是为什么我会被 Kubernetes 洗脑的原因,它是跨越异构系统的一个标准层.
- 将来,我们会像讨论编译器和操作系统内核一样讨论 Kubernetes. Kubernetes 将会是低层级的管路系统,而不在普通应用开发人员的视野之内.
Kubernetes 已成为部署分布式应用的标准方式.在不远的将来,任何新成立的互联网公司都将用到 Kubernetes,无论其是否意识到这点.许多旧应用也正在迁移到 Kubernetes.
起因:Docker
![](https://wordpress-1258894728.cos.ap-beijing.myqcloud.com/202307141033425.png)
单一稳定的一体化模型
![](https://wordpress-1258894728.cos.ap-beijing.myqcloud.com/202307141033216.png)
微型化的应用部署模型
(微服务、分布式、集群、高可用、负载均衡…)
![](https://wordpress-1258894728.cos.ap-beijing.myqcloud.com/202307141033015.png)
容器编排?是需要标准的?
如此多的docker该如何管理(通信、负载均衡、资源共享管理、容灾、监控、健康检查….)?
- Mesos
![](https://wordpress-1258894728.cos.ap-beijing.myqcloud.com/202307141033956.png)
- docker swarm
![](https://wordpress-1258894728.cos.ap-beijing.myqcloud.com/202307141033870.png)
- kubernetes
![](https://wordpress-1258894728.cos.ap-beijing.myqcloud.com/202307141033065.png)
自2016年中,K8s表现出明显优势.
![](https://wordpress-1258894728.cos.ap-beijing.myqcloud.com/202307141033175.png)
二、环境
部署软件环境版本
操作系统: 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 回车,进入安装模式.
![](https://wordpress-1258894728.cos.ap-beijing.myqcloud.com/202307131348608.png)
开始安装过程
安装结束后点击重启
Reboot Now
准备操作
1 | # 修改root密码 |
![](https://wordpress-1258894728.cos.ap-beijing.myqcloud.com/202307131357924.png)
1 | # 修改主机名称 |
![](https://wordpress-1258894728.cos.ap-beijing.myqcloud.com/202307141032296.png)
1 | # 配置静态IP(永久有效)(NAT模式) |
![](https://wordpress-1258894728.cos.ap-beijing.myqcloud.com/202307141032892.png)
1 | # 换源 |
![](https://wordpress-1258894728.cos.ap-beijing.myqcloud.com/202307141032299.png)
三、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 |
![](https://wordpress-1258894728.cos.ap-beijing.myqcloud.com/202307141032611.png)
申请阿里云镜像加速器
申请步骤如下
在阿里云注册自己账户
找到容器镜像服务,参考网址如下
点开左侧菜单镜像中心->镜像加速器
右侧加速器地址,即使私人专属的镜像加速器地址,点击复制
![](https://wordpress-1258894728.cos.ap-beijing.myqcloud.com/202307141032970.png)
Docker配置国内镜像加速器
目的 : 为了下载docker镜像更快
您可以通过修改daemon
配置文件/etc/docker/daemon.json
来使用加速器.
创建/etc/docker/daemon.json
文件,内容如下:
1 | sudo mkdir -p /etc/docker |
![](https://wordpress-1258894728.cos.ap-beijing.myqcloud.com/202307141032222.png)
四、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 |
![](https://wordpress-1258894728.cos.ap-beijing.myqcloud.com/202307141031650.png)
创建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
![](https://wordpress-1258894728.cos.ap-beijing.myqcloud.com/202307141031701.png)
初始化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
执行,即可完成导入等待一会!!!
![](https://wordpress-1258894728.cos.ap-beijing.myqcloud.com/202307171943020.png)
六、应用实例
工作目录:/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 |
![](https://wordpress-1258894728.cos.ap-beijing.myqcloud.com/202307141031099.png)
创建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 |
![](https://wordpress-1258894728.cos.ap-beijing.myqcloud.com/202307141030573.png)
![](https://wordpress-1258894728.cos.ap-beijing.myqcloud.com/202307141030971.png)
![](https://wordpress-1258894728.cos.ap-beijing.myqcloud.com/202307141030828.png)
创建自定义的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
![](https://wordpress-1258894728.cos.ap-beijing.myqcloud.com/202307141029578.png)
下载自定义的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 自己注册,后面才能登录
![](https://wordpress-1258894728.cos.ap-beijing.myqcloud.com/202307141029531.png)
![](https://wordpress-1258894728.cos.ap-beijing.myqcloud.com/202307141029796.png)
- 后端界面
![](https://wordpress-1258894728.cos.ap-beijing.myqcloud.com/202307141029901.png)
课后任务:使用K8s跑一个个人博客或者论坛
七、K8s架构图
![](https://wordpress-1258894728.cos.ap-beijing.myqcloud.com/202307141029190.png)