Kubernetes
一、简单了解
Kubernetes 是一个开源的容器编排引擎,可以用来管理容器化应用,包括容器的自动化部署、扩容、缩容、升级、回滚等,它是 Google 在 2014 年开源的一个项目,它的前身是 Google 内部的 Borg 系统。
二、容器编排引擎的选择
在 Kubernetes 出现之前,我们一般都是使用 Docker 来管理容器化应用,但 Docker 只是一个单机的容器管理工具,它只能管理单个节点上的容器,当我们的应用程序需要运行在多个节点上的时候,就需要使用一些其他工具来管理这些节点,比如 Docker Swarm、Mesos、Kubernetes 等,这些工具都是容器编排引擎,它们可以用来管理多个节点上的容器,但它们之间也有一些区别,比如 Docker Swarm 是 Docker 官方提供的一个容器编排引擎,它的功能比较简单,适合于一些小型的、简单的场景,而 Mesos 和 Kubernetes 则是比较复杂的容器编排引擎,Mesos 是 Apache 基金会的一个开源项目,而 Kubernetes 是 Google 在 2014 年开源的,目前已经成为了 CNCF(Cloud Native Computing Foundation) 的一个顶级项目,基本上已经成为了容器编排引擎的事实标准了。
三、使用 minikube 搭建 kubernetes 集群环境
minikube 是一个轻量级的 kubernetes 集群环境,可以用来在本地快速搭建一个单节点的 kubernetes 集群。
3.1 安装 minikube
1
2
3
4
5
6
7
8
9
# macOS
brew install minikube
# Windows
choco install minikube
# Linux
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
install minikube-linux-amd64 /usr/local/bin/minikube
Docker Desktop 也提供了 minikube,也可以在这里安装。
安装成功
1
2
3
4
# 查看 minikube 版本
minikube version
# 查看 minikube 命令
minikube
3.2 启动 minikube
注意:先启动 Docker,在启动 minikube
1
minikube start --vm-driver=docker --image-mirror-country=cn
启动成功
minikube 自带 kubectl,无需另外安装
1
2
3
4
# 获取节点
kubectl get node
# 查看 minikube 状态
minikube status
四、使用 Multipass 和 k3s 搭建 kubernetes 集群环境
minikube 只能用来搭建一个单节点的 kubernetes 集群环境,而使用 Multipass 和 k3s 可以搭建一个多节点的 kubernetes 集群环境。
4.1 Multipass 介绍
Multipass 是一个轻量级的虚拟机管理工具,可以用来在本地快速创建和管理虚拟机,相比于 Parallels Desktop、VM Ware 或者 VirtualBox 这样的虚拟机管理工具,Multipass 更加轻量快速,而且它还提供了一些命令行工具来方便我们管理虚拟机。
4.1.1 Multipass 安装
1
2
3
4
5
6
7
8
# macOS
brew install multipass
# Windows
choco install multipass
# Linux
snap install multipass
1
2
# 查看 multipass 版本
multipass version
4.1.2 Multipass 常用命令
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
# 查看帮助
multipass help
# 查看镜像列表
multipass find
# 创建一个名叫做 k3s-master1 的虚拟机
multipass launch 24.04 --name k3s-master1 --cpus 2 --memory 8G --disk 10G
# 在虚拟机中执行命令
multipass exec k3s-master1 -- ls -l
# 进入虚拟机并执行 shell
multipass shell k3s-master1
# 查看虚拟机的信息
multipass info k3s-master1
# 停止虚拟机
multipass stop k3s-master1
# 启动虚拟机
multipass start k3s-master1
# 删除虚拟机
multipass delete k3s-master1
# 清理虚拟机
multipass purge
# 查看虚拟机列表
multipass list
# 挂载目录
multipass mount <host_path> <instance_name>:<mount_path>
<host_path>: 宿主机上要挂载的目录路径
<instance_name>: Multipass 虚拟机的名称
<mount_path>: 虚拟机内部的挂载路径
4.2 创建和配置虚拟机
1、使用 multipass 创建 k3s-master1、k3s-worker1、k3s-worker2 虚拟机;multipass 会自动下载 ubuntu 24.04 的镜像,并且使用这个镜像创建虚拟机;
1
2
3
multipass launch 24.04 --name k3s-master1 --cpus 2 --memory 8G --disk 10G
multipass launch 24.04 --name k3s-worker1 --cpus 2 --memory 8G --disk 10G
multipass launch 24.04 --name k3s-worker2 --cpus 2 --memory 8G --disk 10G
2、查看虚拟机列表;
1
multipass list
3、为 root 用户添加密码,multipass 创建的虚拟机默认是没有密码的;
1
2
3
4
5
6
7
8
# 登录虚拟机
multipass shell k3s-master1
# 设置密码
sudo passwd
# 切换用户
su root
# 切换目录
cd ~
4、配置 SSH 密钥登录,不过这一步并不是必须的,即使不配置也可以通过 multipass exec
或者 multipass shell
命令来进入虚拟机;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 修改 ssh 配置
vi /etc/ssh/sshd_config
PermitRootLogin yes # 允许 root 用户登录
PasswordAuthentication yes # 允许使用密码登录
# 重启 ssh 服务
service ssh restart
# 本地生成密钥对
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519 -C "15235032479@163.com"
# 将公钥复制到虚拟机中,配置免密登录
scp ~/.ssh/id_ed25519.pub root@192.168.64.12:~/.ssh/
cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys
# 本地简化登录命令
vi ~/.zshrc
alias k3s-master1='ssh root@192.168.64.12'
source ~/.zshrc
1
2
3
4
5
6
7
8
9
apt-get remove docker docker-engine docker.io containerd runc
apt-get update
apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
apt-key fingerprint 0EBFCD88
add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/ $(lsb_release -cs) stable"
apt-get update
apt-get install docker-ce docker-ce-cli containerd.io
docker images
6、给 docker 设置镜像
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
vi /etc/docker/daemon.json
{
"max-concurrent-downloads": 10,
"max-concurrent-uploads": 5,
"default-shm-size": "1G",
"debug": true,
"experimental": false,
"registry-mirrors": [
"https://cb7z4xxz.mirror.aliyuncs.com",
"https://docker.1panel.live",
"https://atomhub.openatom.cn",
"https://dockerproxy.com"
]
}
systemctl daemon-reload
systemctl restart docker
journalctl -u docker.service -f
4.3 k3s 集群
k3s 是一个轻量级的 Kubernetes 发行版,它是 Rancher Labs 推出的一个开源项目,旨在简化 Kubernetes 的安装和维护,同时它还是 CNCF 认证的 Kubernetes 发行版。
1、在 k3s-master1 节点上安装 autok3s
1
docker run -itd --restart=unless-stopped --name autok3s --net=host -v /var/run/docker.sock:/var/run/docker.sock cnrancher/autok3s:v0.7.0
注意:一定要安装 v0.7.0
及以上的,阿里云镜像由 https://rancher-mirror.oss-cn-beijing.aliyuncs.com/k3s/k3s-install.sh
变成 https://rancher-mirror.rancher.cn/k3s/k3s-install.sh
,v0.7.0
以下的版本已经不能用阿里云镜像了。
1
2
3
4
scp ~/.ssh/id_ed25519 root@192.168.64.12:~/.ssh/
docker exec -it autok3s mkdir -p /root/.ssh
docker cp /root/.ssh/id_ed25519 autok3s:/root/.ssh/id_ed25519
docker exec -it autok3s bash
1
http://192.168.64.12:8080/
2、创建 k3s 集群
4.4 kuboard
1、在 k3s-master1 节点上安装 kuboard
1
docker run --restart=unless-stopped -p 8081:80 -d --name kuboard -e KUBOARD_AGENT_SERVER_TCP_PORT=10081 -e KUBOARD_ENDPOINT=http://192.168.64.12:80 -v /root/kuboard-data:/data eipwork/kuboard:v3
注意:创建 k3s-cluster1 的时候 80 端口已被占用。
1
docker logs -f kuboard
1
2
3
http://192.168.64.12:8081/
admin
Kuboard123
2、在 kuboard 中添加 创建好的 k3s 集群
3、在 k3s 集群中创建命名空间
4、创建 IngressClass
5、创建 Deployment
6、创建 Service
7、查看代理
8、查看自动分配的节点端口
9、查看 IngressClass 负载均衡映射端口
10、扩容,查看负载均衡效果
4.4 等同
1
2
3
4
5
6
curl -L https://github.com/docker/compose/releases/download/v2.29.7/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
curl -L https://github.com/docker/compose/releases/download/v2.29.7/docker-compose-linux-aarch64 > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose version
五、在线实验环境
Killercoda 每次只能用一个小时
六、kubectl 常用命令
6.1 基础使用
1
2
3
4
5
6
# 查看帮助
kubectl --help
# 查看 API 版本
kubectl api-versions
# 查看集群信息
kubectl cluster-info
6.2 资源的创建和运行
1
2
3
4
5
6
7
8
9
10
11
12
# 在默认的命名空间中创建并运行一个名为 nginx 的 Pod
kubectl --namespace=default run nginx --image=nginx:stable-alpine
# 根据 nginx.yaml 配置文件创建资源
kubectl create -f nginx.yaml
# 根据目录下的所有配置文件创建资源
kubectl create -f ./dir
# 根据 URL 创建资源
kubectl create -f https://k8s.io/examples/application/deployment.yaml
# 根据 nginx.yaml 配置文件创建或更新资源
kubectl apply -f nginx.yaml
6.3 查看资源信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
kubectl --namespace=default get pods / po # 查看Pod
kubectl --namespace=default get svc # 查看Service
kubectl --namespace=default get deploy # 查看Deployment
kubectl --namespace=default get rs # 查看ReplicaSet
kubectl --namespace=default get cm # 查看ConfigMap
kubectl --namespace=default get secret # 查看Secret
kubectl --namespace=default get ing # 查看Ingress
kubectl --namespace=default get pv # 查看PersistentVolume
kubectl --namespace=default get pvc # 查看PersistentVolumeClaim
kubectl --namespace=default get ns # 查看Namespace
kubectl --namespace=default get node # 查看Node
kubectl --namespace=default get all # 查看所有资源
# 查看更多信息
kubectl --namespace=default get pods -o wide
# 查看名为 nginx 的 Pod 的详细信息
kubectl --namespace=default describe pod nginx
6.4 资源的修改、删除和清理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 更新某个资源的标签
kubectl --namespace=NAMESPACE label RESOURCE NAME KEY_1=VALUE_1 ... KEY_N=VALUE_N
kubectl --namespace=default label pod nginx app=nginx
# 删除某个资源
kubectl --namespace=NAMESPACE delete RESOURCE NAME
kubectl --namespace=default delete pod nginx
# 删除某个资源的所有实例
kubectl --namespace=NAMESPACE delete RESOURCE --all
kubectl --namespace=default delete pod --all
# 根据 nginx.yaml 配置文件删除资源
kubectl delete -f nginx.yaml
# 根据目录下的所有配置文件删除资源
kubectl delete -f ./dir
# 设置某个资源的副本数
kubectl --namespace=NAMESPACE scale --replicas=COUNT RESOURCE/NAME
kubectl --namespace=default scale --replicas=3 deployment/nginx
6.5 调试和交互
1
2
3
4
5
6
7
8
# 进入名为 nginx 的 Pod 容器中,并执行 /bin/bash 命令
kubectl --namespace=default exec -it nginx -- /bin/bash
# 跟踪名为 nginx 的 Pod 日志
kubectl --namespace=default logs -f nginx
# 将名为 nginx 的 Deployment 暴露出去,成为一个 Service
kubectl --namespace=default deployment nginx
七、服务的类型
类型 | 说明 |
---|---|
ClusterlP | 默认,集群内部的服务 |
NodePort | 节点端口,将服务公开到集群节点上 |
LoadBalancer | 负载均衡,将服务公开到外部负载均衡器上 |
ExternalName | 外部名称,将服务映射到一个外部域名上 |
Headless | 无头,主要用于DNS解析和服务发现 |
八、containerd
1
vi /etc/containerd/config.toml
1
2
[plugins."io.containerd.grpc.v1.cri".registry]
config_path = "/etc/containerd/certs.d"
1
2
3
mkdir /etc/containerd/certs.d
mkdir /etc/containerd/certs.d/docker.io
vi /etc/containerd/certs.d/docker.io/hosts.toml
1
2
3
4
5
6
7
8
9
10
11
server="https://docker.io"
[host."https://cb7z4xxz.mirror.aliyuncs.com"]
capabilities = ["pull", "resolve"]
[host."https://docker.1panel.live"]
capabilities = ["pull", "resolve"]
[host."https://atomhub.openatom.cn"]
capabilities = ["pull", "resolve"]
[host."https://dockerproxy.com"]
capabilities = ["pull", "resolve"]
[host."https://docker.io"]
capabilities = ["pull", "resolve"]
1
2
3
4
5
systemctl restart containerd
journalctl -u containerd.service -f
ctr -n docker.io images pull --hosts-dir "/etc/containerd/certs.d" docker.io/library/nginx:latest
ctr -n docker.io images list
ctr -n docker.io images delete