文章

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,也可以在这里安装。

image-20241019110922355

安装成功

image-20241019111552591

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

四、使用 Multipassk3s 搭建 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

image-20241020223804426

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

5、安装 docker

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.shv0.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 集群

image-20241020234951662

image-20241021230952526

image-20241021232846057

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 端口已被占用。

image-20241021235848998

1
docker logs -f kuboard
1
2
3
http://192.168.64.12:8081/
admin
Kuboard123

2、在 kuboard 中添加 创建好的 k3s 集群

image-20241022000337599

image-20241022000644152

image-20241022000920068

image-20241022001205977

3、在 k3s 集群中创建命名空间

image-20241022204341140

image-20241022213417540

4、创建 IngressClass

image-20241022231117967

image-20241022231226931

image-20241022231323787

5、创建 Deployment

image-20241022214029396

image-20241022232249447

image-20241022232221594

image-20241022231858118

6、创建 Service

image-20241022232046252

7、查看代理

image-20241022234426063

image-20241022234516101

8、查看自动分配的节点端口

image-20241022235056902

image-20241022235145663

9、查看 IngressClass 负载均衡映射端口

image-20241022235346636

image-20241022235445484

image-20241023000012325

10、扩容,查看负载均衡效果

image-20241025202415659

image-20241025202918987

image-20241025203022499

image-20241025213753931

image-20241025213811401

4.4 等同

image-20241025214059936

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

image-20241025214853731

image-20241025214923564

五、在线实验环境

Killercoda 每次只能用一个小时

Play-With-K8s

六、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解析和服务发现

image-20241027161545828

image-20241027161639929

八、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
本文由作者按照 CC BY 4.0 进行授权