安装k8s集群,需要先安装3个软件:kubectl(命令行接口)、kubeadm(集群管理命令工具)和kubelet
首先我们准备环境,以1个master和2个node节点为例。
hostname | 系统 | 配置 | IP | 组件 |
---|---|---|---|---|
vm21 | ubuntu22.04 | 2核4G | 10.10.1.21 | contrainerd,kubectl,kubeadm,kubelet |
vm22 | ubuntu22.04 | 2核2G | 10.10.1.22 | contrainerd,kubectl,kubeadm,kubelet |
vm23 | ubuntu22.04 | 2核2G | 10.10.1.23 | contrainerd,kubectl,kubeadm,kubelet |
- 系统地址参考阿里云:https://mirrors.aliyun.com/oldubuntu-releases/releases/22.04.3/?spm=a2c6h.25603864.0.0.54997ff3kU594I
- ip根据自己虚拟机而定,最好设置静态地址
- 安装组件contrainerd就行的,但是要拉取镜像什么的,用docker习惯了,就安装docker吧,docker 中包含 contrainerd的
1. 系统设置
系统设置部分,3台机器都要
1.1 设置root账号密码
sudo passwd root
# 输入现在的账号密码,然后设定root账号密码
# 切换到 root
su
1.2 安装ssh,开启root登陆
apt install openssh-server
apt install vim
# 修改配置
vim /etc/ssh/sshd_config
# PermitRootLogin 选项去掉注释,改成yes:PermitRootLogin yes
1.3 修改安装源
用root账号登陆后。
参考 阿里云 教程:https://developer.aliyun.com/mirror/ubuntu?spm=a2c6h.13651102.0.0.7e311b11FgNIod
vim /etc/apt/sources.list
# 替换成下面的:
deb https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
# deb https://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
# deb-src https://mirrors.aliyun.com/ubuntu/ jammy-proposed main restricted universe multiverse
deb https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
deb-src https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
# 更新系统
apt update
apt upgrade
1. 4 主机名解析,修改host,注意和主机hostname一样
vim /etc/hosts
# 添加下面的,注意原来有的1个删了
10.10.1.21 vm21
10.10.1.22 vm22
10.10.1.23 vm23
1.5 配置时间同步
apt-get install ntpdate
# 设置阿里云时间服务器
ntpdate time1.aliyun.com
1.6 关闭防火墙
systemctl stop ufw
systemctl disable ufw
1.7 关闭selinux
vim /etc/selinux/config
# 写入以下配置,保存退出
SELINUX=disabled
# 最后重启,检查
reboot
apt install selinux-utils
getenforce
1.8 禁用swap分区
vim /etc/fstab
# 注释掉 /swapfile none swap sw 0 0这一行
#/swapfile none swap sw 0 0
# 重启系统
reboot
# 检查
free -m
1.9 配置网桥和内核转发
# 1.
cat << EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
# 2. 上面配置会开机自启,现在也开启
modprobe overlay
modprobe br_netfilter
# 3. 查看
lsmod | egrep "overlay"
lsmod | egrep "br_netfilter"
# 4. 网桥过滤和内核转发追加到 k8s.conf 文件
cat << EOF | tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
# 5. 加载内核参数
sysctl --system
# 6. 查看
sysctl -a | grep ip_forward
1.10 配置ipvs功能
在Kubernetes中Service有两种带来模型,一种是基于iptables的,一种是基于ipvs的两者比较的话,ipvs的性能明显要高一些,但是如果要使用它,需要手动载入ipvs模块
apt-get install ipset ipvsadm
# 配置 ipvsadm 模块启动时自动加载
cat << EOF | tee /etc/modules-load.d/ipvs.conf
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF
# 重启
reboot
# 检查
lsmod | grep ip_vs
1.11 安装Docker
用脚本自动安装的,参考的 南京大学的 开源镜像帮助文档:
https://mirror.nju.edu.cn/mirrorz-help/docker-ce/?mirror=NJU
其实,清华大学的帮助文档也有,但是给的下载脚本的地址国内好像被墙了,github上的有时还能下下来,所以选的南京大学的。
安装好以后设置开机自启:
systemctl enable docker
其实,我们可以不用docker,我们需要的是contrainerd,而安装了docker,contrainerd也就有了。
这里注意一下:containerd的配置需要修改一下
# 1. 生成containerd默认配置,其实现在这个文件是有的,但是内容不全
containerd config default > /etc/containerd/config.toml
# 2. 修改1 在60多行,sandbox_image = "registry.k8s.io/pause:3.6",改成我们kubernetes版本一致的,现在应该是3.9,后面会说怎么看。
# 改成:sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.9"
# 3. 修改2 在130行左右,我这127行,SystemdCgroup = false改成SystemdCgroup = true
# 4. 直接重启吧 reboot
1.12 安装3大组件-kubeadm、kubelet、kubectl
参考阿里云给的方法:https://developer.aliyun.com/mirror/kubernetes?spm=a2c6h.13651102.0.0.78ba1b119Qwd9O
我是打算安装最新的,现在是1.30.3
apt-get install -y apt-transport-https
curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/Release.key |
gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.30/deb/ /" |
tee /etc/apt/sources.list.d/kubernetes.list
apt-get update
apt-get install -y kubelet kubeadm kubectl
1.13 下载所需镜像
某些原因,镜像下载不好用,我们先用阿里云源,下载下来所需镜像。
官方给了 查询镜像的方法:https://kubernetes.io/zh-cn/docs/reference/setup-tools/kubeadm/kubeadm-init/
# 查询所需镜像
kubeadm config images list
# 查看阿里云镜像仓库地址中的镜像列表
kubeadm config images list --image-repository registry.aliyuncs.com/google_containers
# 把阿里镜像源的 那 7个 拉下来 就行了,我这都能拉下来
docker pull registry.aliyuncs.com/google_containers/kube-apiserver:v1.30.3
docker pull registry.aliyuncs.com/google_containers/kube-controller-manager:v1.30.3
docker pull registry.aliyuncs.com/google_containers/kube-scheduler:v1.30.3
docker pull registry.aliyuncs.com/google_containers/kube-proxy:v1.30.3
docker pull registry.aliyuncs.com/google_containers/coredns:v1.11.1
docker pull registry.aliyuncs.com/google_containers/pause:3.9
docker pull registry.aliyuncs.com/google_containers/etcd:3.5.12-0
2. 安装Kubernetes集群
2.1 集群初始化 -- 仅对master节点
使用kubeadm初始化集群
cd /
# 生成kubeadm默认配置文件
kubeadm config print init-defaults > kubeadm-config.yaml
# 2. 修改默认配置
vim kubeadm-config.yaml
- ip修改为我们master节点ip:localAPIEndpoint.advertiseAddress: 10.10.1.21
- 修改名称:nodeRegistration.name: vm21
- 镜像源修改为阿里的:imageRepository: registry.aliyuncs.com/google_containers
- kubernetesVersion修改:kubernetesVersion: 1.30.3
- 添加networking.podSubnet:networking.podSubnet: 10.244.0.0/16
- 文件末尾添加cgroup(有分隔符):
--- kind: KubeletConfiguration apiVersion: kubelet.config.k8s.io/v1beta1 cgroupDriver: systemd
上面已经下载好镜像了,初始化配置文件也修改了,进行初始化:
# 初始化命令
kubeadm init --config kubeadm-config.yaml
初始化成功以后,需要配置一下系统,截图上已经给了,上面还给出了其他节点加入集群的命令,要记录下来用。我是root,但也执行了这个:
# 主要是吧 命令加到环境变量中,不然kubectl命令报错
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
export KUBECONFIG=/etc/kubernetes/admin.conf
初始化以后,查看节点和pod是这样的。
kubectl get nodes
kubectl get pod -A
2.2 添加node节点
上面初始化时已经生成了加入命令了(不记得了用这个生成:kubeadm token create --print-join-command
),我们只需要在node节点执行就可以了
分别在另外2台机器执行:
kubeadm join 10.10.1.21:6443 --token 42hek0.a24j8outjbvv7lkg --discovery-token-ca-cert-hash sha256:d038e3cf2d2af889bf43f3fcdf70f028f014c3bc26a1784d76b248b070bf8e41
修改一下节点角色,master执行:
kubectl label node vm22 node-role.kubernetes.io/worker=worker
kubectl label node vm23 node-role.kubernetes.io/worker=worker
3. 安装网络插件
从上面pod可以看见,coredns 停滞在 Pending 状态。这是正常的。
官网是这么说的:这一行为是预期之中的,因为系统就是这么设计的。kubeadm 的网络供应商是中立的, 因此管理员应该选择安装 Pod 的网络插件。 你必须完成 Pod 的网络配置,然后才能完全部署 CoreDNS。 在网络被配置好之前,DNS 组件会一直处于 Pending 状态。
3.1 网络插件
常见的网络插件有Flannel、Calico 、Cilium 。
- Flannel 适合小规模集群
-
Calico 是一套开源的纯三层的虚拟化网络解决方案,是目前K8s主流的网络方案。它把每个节点都作为一个虚拟路由器,把Pod当做路由器上一个终端设备为其分配一个IP地址,通过BGP协议生成路由规则,实现不同节点上的Pod网络互通。既适合小规模也适合大规模,部署也比较容易。
- Cilium 对内核的版本要求较高,内核版本必须要达到6.3以上
这里我们选用Calico。
3.2 安装Calico
Calico官网文档:https://docs.tigera.io/calico/latest/getting-started/kubernetes/quickstart
3.2.1 版本选择
首先我们要查询一下和我们K8s版本对应的Calico版本。在Calico的系统需求里面能找到。Calico v3.28里面能找到K8s v1.30版本。
3.2.2 快速安装
然后,根据Calico的快速开始文档就可以安装了。注意,是在 master节点。文档一共5步,我们按顺序来:
- 配置
tigera-operator
命名空间
- 配置
kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.28.1/manifests/tigera-operator.yaml
执行完以后,可以用命令(
kubectl get ns
)查看到tigera-operator
命名空间已经好了并且运行正常。
- 配置安装Calico
下载下来custom-resources.yaml
文件,将网段改成10.244.0.0/16
(因为前面k8s初始化的时候设置的pod网段就是这个)。
cd /
wget https://raw.githubusercontent.com/projectcalico/calico/v3.28.1/manifests/custom-resources.yaml
安装这个和初始化k8s差不多的,也是需要镜像。所以,我们需要先准备镜像。
注意!注意!注意!
反正这我是踩了一天的坑!一开始用的docker镜像,总是出问题,明明镜像在那,还说拉取不下来,一着急docker镜像删了,用ctr(contrainerd带的命令行工具)重新拉取,这才能用了。所以不要拉docker镜像了,直接ctr。
-
先说需要哪些镜像?7个,别问怎么知道的,4种pod节点我一个个试出来的,每次running不成功看看是什么
- 直接拉取不一定成功,先设置加速地址(不知道有没有用),然后拉取
我是从这个里面挑了2个加进去了:https://github.com/DaoCloud/public-image-mirror/issues/2328
镜像拉取命令(3个node都要拉!3个node都要拉!3个node都要拉!):
# node类型pod中3个
ctr image pull docker.1panel.live/calico/cni:v3.28.1
ctr image pull docker.1panel.live/calico/pod2daemon-flexvol:v3.28.1
ctr image pull docker.1panel.live/calico/node:v3.28.1
# node-driver类型pod中2个
ctr image pull docker.1panel.live/calico/csi:v3.28.1
ctr image pull docker.1panel.live/calico/node-driver-registrar:v3.28.1
# typha类型pod中1个
ctr image pull docker.1panel.live/calico/typha:v3.28.1
# controller类型pod中1个
ctr image pull docker.1panel.live/calico/kube-controllers:v3.28.1
# 这是后来又出现的calico-apiserver 命名空间中需要的
ctr image pull docker.1panel.live/calico/apiserver:v3.28.1
镜像拉下来以后,执行creat命令(master节点就行):
kubectl create -f custom-resources.yaml
- 查看安装结果
上面执行完以后,我们看一下命名空间和pod
kubectl get ns
kubectl get pods -A
kubectl get nodes
这里补充2个实用命令:
# 查看pod情况描述的,包含了ip和镜像以及报错的日志
kubectl describe pod calico-apiserver-77c695bdb6-6bqrn -n calico-apiserver
# 这个是删除pod的,拉取镜像后,删除pod,会自动重建pod,就好了
kubectl delete pod calico-apiserver-77c695bdb6-6bqrn -n calico-apiserver
到这里,K8s基本安装完成了,节点和pod都正常运行了。
4. 部署nginx测试
K8s里面有 service
的概念,service
是盒一组Pod关联的。当我们部署服务以后,多了一组pod,同时也会多一个service,定义了访问服务的ip、端口等信息。
查看命令:kubectl get service
。我们先来看一下现在的:
- 创建nginx配置文件
vim nginx-deployment.yaml
- 添加如下配置:
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: mynginx # 部署的名称
spec:
replicas: 2 # 设置副本数量为2
selector:
matchLabels:
app: mynginx1 # 用于选择匹配的Pod标签
template:
metadata:
labels:
app: mynginx1 # Pod的标签
spec:
containers:
- name: nginx # 容器名称
image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginx:latest # 镜像拉取地址,换成阿里云的,不然会拉取失败
imagePullPolicy: IfNotPresent # 镜像拉取策略,如果本地没有就拉取
ports:
- containerPort: 80 # 容器内部监听的端口
---
apiVersion: v1
kind: Service
metadata:
name: nginx-service # 服务的名称
spec:
externalTrafficPolicy: Cluster # 外部流量策略设置为集群
selector:
app: mynginx1 # 用于选择匹配的Pod标签
ports:
- protocol: TCP # 使用TCP协议
port: 80 # 服务暴露的端口
targetPort: 80 # Pod中容器的端口
nodePort: 30080 # 在每个Node上分配的端口,用于外部访问
type: NodePort # 服务类型,使用NodePort
- 应用配置
kubectl apply -f nginx-deployment.yaml
- 查看
kubectl get pods -o wide
kubectl get service
- 访问
访问分集群内部,外部访问,我们试一下。
内部:curl 10.100.196.101
外部,外部访问从每个节点都可以,每个节点 ip不一样,端口都是一样的:
- 访问