Ubuntu20.04搭建k8s集群()-ubuntu
Ubuntu20.04搭建k8s集群()
前言
- 服务器统一版本 Ubuntu 20.04
- 搭建集群最少要两台服务器
- 每台服务器都需要 docker、环境配置、安装 kubeadm、kubelet 和 kubectl
docker
安装 docker
sudo apt install -y docker.io # 安装Docker Engine
sudo service docker start # 启动docker服务
操作 必须要有 权限,直接使用 用户不够安全,加入 用户组是一个比较好的选择。
Docker
root
root
Docker
如果你没有使用 账号,则需要将当前用户加入 的用户组:
root
Docker
sudo usermod -aG docker ${USER} # 当前用户加入docker组
修改用户组之后,需要退出系统,重新登录 才能生效。
usermod
docker version # 输出Docker客户端和服务器各自的版本信息
配置 docker
需要将 的驱动程序改为 ,配置代理镜像源,然后重启 的守护进程。
dockeer
systemd
Docker
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com"
],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
sudo systemctl enable docker # 配置Docker为开机自启动
sudo systemctl daemon-reload # 重新加载服务的配置文件
sudo systemctl restart docker # 重启Docker
环境配置
更新 hosts 和 hostname 配置信息
使用主机名来区分集群里的节点,所以每个节点的 必须不能重名。
Kubernetes
hostname
# 每个节点分别设置对应主机名
hostnamectl set-hostname master
hostnamectl set-hostname node1
hostnamectl set-hostname node2
或者
sudo vim /etc/hostname
修改完 后,重新登录,当前命令行界面连接 才会更新。
hostname
hostname
# 所有节点都修改 hosts
vim /etc/hosts
192.168.77.100 master
192.168.77.101 node1
192.168.77.102 node2
iptables 配置
为了让 能够检查、转发网络流量,需要修改 的配置,并启用 模块。
Kubernetes
iptables
br_netfilter
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | sudo 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 # better than modify /etc/sysctl.conf
EOF
sudo sysctl --system # 手动加载所有的配置文件
关闭 swap 分区
关闭 的 分区,提升 的性能。
Linux
swap
Kubernetes
# 临时关闭
sudo swapoff -a
# 永久关闭:注释 swap 挂载,给 swap 这行开头加一下 "#" 注释
sudo sed -ri '/\sswap\s/s/^#?/#/' /etc/fstab
为什么要关闭 swap 交换分区?
Swap 交换分区,如果机器内存不够,会使用 swap 分区,但是 swap 分区的性能较低,k8s 设计的时候为了能提升性能,默认是不允许使用交换分区的。Kubeadm 初始化的时候会检测 swap 是否关闭,如果没关闭,那就初始化失败。如果不想要关闭交换分区,安装k8s 的时候可以指定 –ignore-preflight-errors=Swap 来解决。
为什么要关闭 swap 交换分区?
Swap 交换分区,如果机器内存不够,会使用 swap 分区,但是 swap 分区的性能较低,k8s 设计的时候为了能提升性能,默认是不允许使用交换分区的。Kubeadm 初始化的时候会检测 swap 是否关闭,如果没关闭,那就初始化失败。如果不想要关闭交换分区,安装k8s 的时候可以指定 –ignore-preflight-errors=Swap 来解决。
安装 kubeadm、kubelet 和 kubectl
更新使用阿里云镜像源
sudo apt install -y apt-transport-https ca-certificates curl
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
sudo apt update
下载
默认会下载最新版本,也可以指定版本号。
apt
sudo apt install -y kubeadm=1.23.3-00 kubelet=1.23.3-00 kubectl=1.23.3-00
安装完成之后,可以用 、 来验证版本是否正确。
kubeadm version
kubectl version
systemctl enable kubelet.service # 配置kubelet为开机自启动
版本锁定
锁定这三个软件的版本,避免意外升级导致版本错误。
sudo apt-mark hold kubeadm kubelet kubectl
下载 Kubernetes 组件镜像
组件镜像是放在 自己的镜像仓库网站 ,国内访问不了,需要提前把镜像下载到本地。
Kubernetes
Google
gcr.io
命令 可以查看安装 所需的镜像列表,参数 可以指定版本号:
kubeadm config images list
Kubernetes
--kubernetes-version
kubeadm config images list --kubernetes-version v1.23.3
k8s.gcr.io/kube-apiserver:v1.23.3
k8s.gcr.io/kube-controller-manager:v1.23.3
k8s.gcr.io/kube-scheduler:v1.23.3
k8s.gcr.io/kube-proxy:v1.23.3
k8s.gcr.io/pause:3.6
k8s.gcr.io/etcd:3.5.1-0
k8s.gcr.io/coredns/coredns:v1.8.6
shell 自动化下载镜像
自动化从国内镜像网站下载,然后再用 改名。
shell
docker tag
repo=registry.aliyuncs.com/google_containers
for name in `kubeadm config images list --kubernetes-version v1.23.3`; do
src_name=${name#k8s.gcr.io/}
src_name=${src_name#coredns/}
docker pull $repo/$src_name
docker tag $repo/$src_name $name
docker rmi $repo/$src_name
done
如果国内镜像网站不提供服务,或者修改了镜像,此方法将会失败,请对比所需的镜像列表是否一致。
如果国内镜像网站不提供服务,或者修改了镜像,此方法将会失败,请对比所需的镜像列表是否一致。
修改 kubelet 启动参数
添加 的启动参数, 每个主机都要添加并指定对应的公网 ,添加了这一步才能使用公网 来注册进集群。
kubelet
--node-ip=公网IP
ip
ip
systemctl status kubelet # 查看kubelet运行状态、加载配置文件路径
kubelet.service - kubelet: The Kubernetes Node Agent
Loaded: loaded (/lib/systemd/system/kubelet.service; enabled; vendor preset: enabled)
Drop-In: /etc/systemd/system/kubelet.service.d
└─10-kubeadm.conf
Active: activating (auto-restart) (Result: exit-code) since Wed 2023-03-15 17:57:03 CST; >
Docs: https://kubernetes.io/docs/home/
Process: 14400 ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $K>
Main PID: 14400 (code=exited, status=1/FAILURE)
vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
# 最后一行添加公网IP
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS --node-ip=<公网Ip>
初始化 master 节点
选择一个节点作为master,仅在master节点初始化。
若失败了可以用 重置,删除 后,再 初始化。
选择一个节点作为master,仅在master节点初始化。
若失败了可以用 重置,删除 后,再 初始化。
kubeadm reset
$HOME/.kube
kubeadm init
sudo kubeadm init \
--apiserver-advertise-address=<公网IP> \
--control-plane-endpoint=<公网IP> \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--service-cidr=10.10.0.0/16 \
--pod-network-cidr=10.244.0.0/16 \
--kubernetes-version=v1.23.3
# --apiserver-advertise-address: 指定master服务发布的ip地址
# --control-plane-endpoint: 可用于为所有控制平面节点设置共享端点,允许IP地址和可以映射到IP地址的DNS名称,例如 192.168.77.100 master
# --image-repository: 指定镜像源
# --service-cidr: 指定service网络的IP地址范围
# --pod-network-cidr: 指定pod网络的IP地址范围
# --kubernetes-version: 指定k8s版本
因为已经提前把镜像下载到了本地,所以 的安装过程很快就完成了。
kubeadm
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:
kubeadm join 192.168.77.100:6443 --token m93vq1.xxxxxxxxxxxx \
--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxx201631b982ffc0e7593d4d845e9c916bb7b512081f510 \
--control-plane
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.77.100:6443 --token m93vq1.xxxxxxxxxxxx \
--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxx201631b982ffc0e7593d4d845e9c916bb7b512081f510
按照提示,在本地建立一个 目录,然后拷贝 配置文件,改变文件关联用户组权限。
.kube
kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
提示,其他节点要加入集群必须要用指令里的 和 证书,这条命令需要保存好,在 节点执行。
kubeadm join
token
ca
node
使用 Calico 网络插件
上述 节点初始化后,可以使用 来检查 集群节点状态,当前 节点的状态为 ,这是由于缺少网络插件,集群的内部网络还没有正常运作。
master
kubectl get node
kubernetes
master
NotReady
可以在 的网站(https://www.tigera.io/project-calico/)上找到它的安装方式,需要注意 版本支持适配的 版本。
Calico
Calico
kubernets
wget https://projectcalico.docs.tigera.io/archive/v3.24/manifests/calico.yaml
使用的镜像较大,如果安装超时,可以考虑在每个节点上预先使用 拉取镜像:
Calico
docker pull
# 从calico.yaml文件中,找到需要下载的镜像源
docker pull docker.io/calico/kube-controllers:v3.24.5
docker pull docker.io/calico/node:v3.24.5
docker pull docker.io/calico/pod2daemon-flexvol:v3.24.5
docker pull docker.io/calico/cni:v3.24.5
安装使用 即可:
Calico
kubectl apply
kubectl apply -f calico.yaml
安装 Worker 节点
在 节点机器上,使用 初始化成功后的 命令:
worker
master
join
kubeadm join 192.168.77.100:6443 --token m93vq1.xxxxxxxxxxxx \
--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxx201631b982ffc0e7593d4d845e9c916bb7b512081f510
它会连接 节点,然后拉取镜像,安装网络插件,最后把节点加入集群。
master
如果 命令找不到了,可以创建新的 :
join
token
kubeadm token create --print-join-command
如果遇到拉取镜像的问题,同样使用 下载到本地即可。
docker pull
等 节点完成运行后,在 节点上 可以看到各个节点状态变为 :
worker
master
kubectl get node
Ready
kubectl get node
NAME STATUS ROLES AGE VERSION
master Ready control-plane,master 16h v1.23.3
node1 Ready <none> 15h v1.23.3
node2 Ready <none> 15h v1.23.3
前言
- 服务器统一版本 Ubuntu 20.04
- 搭建集群最少要两台服务器
- 每台服务器都需要 docker、环境配置、安装 kubeadm、kubelet 和 kubectl
docker
安装 docker
sudo apt install -y docker.io # 安装Docker Engine
sudo service docker start # 启动docker服务
操作 必须要有 权限,直接使用 用户不够安全,加入 用户组是一个比较好的选择。
Docker
root
root
Docker
如果你没有使用 账号,则需要将当前用户加入 的用户组:
root
Docker
sudo usermod -aG docker ${USER} # 当前用户加入docker组
修改用户组之后,需要退出系统,重新登录 才能生效。
usermod
docker version # 输出Docker客户端和服务器各自的版本信息
配置 docker
需要将 的驱动程序改为 ,配置代理镜像源,然后重启 的守护进程。
dockeer
systemd
Docker
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"registry-mirrors": [
"http://hub-mirror.c.163.com",
"https://docker.mirrors.ustc.edu.cn",
"https://registry.docker-cn.com"
],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
sudo systemctl enable docker # 配置Docker为开机自启动
sudo systemctl daemon-reload # 重新加载服务的配置文件
sudo systemctl restart docker # 重启Docker
环境配置
更新 hosts 和 hostname 配置信息
使用主机名来区分集群里的节点,所以每个节点的 必须不能重名。
Kubernetes
hostname
# 每个节点分别设置对应主机名
hostnamectl set-hostname master
hostnamectl set-hostname node1
hostnamectl set-hostname node2
或者
sudo vim /etc/hostname
修改完 后,重新登录,当前命令行界面连接 才会更新。
hostname
hostname
# 所有节点都修改 hosts
vim /etc/hosts
192.168.77.100 master
192.168.77.101 node1
192.168.77.102 node2
iptables 配置
为了让 能够检查、转发网络流量,需要修改 的配置,并启用 模块。
Kubernetes
iptables
br_netfilter
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF
cat <<EOF | sudo 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 # better than modify /etc/sysctl.conf
EOF
sudo sysctl --system # 手动加载所有的配置文件
关闭 swap 分区
关闭 的 分区,提升 的性能。
Linux
swap
Kubernetes
# 临时关闭
sudo swapoff -a
# 永久关闭:注释 swap 挂载,给 swap 这行开头加一下 "#" 注释
sudo sed -ri '/\sswap\s/s/^#?/#/' /etc/fstab
为什么要关闭 swap 交换分区?
Swap 交换分区,如果机器内存不够,会使用 swap 分区,但是 swap 分区的性能较低,k8s 设计的时候为了能提升性能,默认是不允许使用交换分区的。Kubeadm 初始化的时候会检测 swap 是否关闭,如果没关闭,那就初始化失败。如果不想要关闭交换分区,安装k8s 的时候可以指定 –ignore-preflight-errors=Swap 来解决。
为什么要关闭 swap 交换分区?
Swap 交换分区,如果机器内存不够,会使用 swap 分区,但是 swap 分区的性能较低,k8s 设计的时候为了能提升性能,默认是不允许使用交换分区的。Kubeadm 初始化的时候会检测 swap 是否关闭,如果没关闭,那就初始化失败。如果不想要关闭交换分区,安装k8s 的时候可以指定 –ignore-preflight-errors=Swap 来解决。
安装 kubeadm、kubelet 和 kubectl
更新使用阿里云镜像源
sudo apt install -y apt-transport-https ca-certificates curl
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
cat <<EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
sudo apt update
下载
默认会下载最新版本,也可以指定版本号。
apt
sudo apt install -y kubeadm=1.23.3-00 kubelet=1.23.3-00 kubectl=1.23.3-00
安装完成之后,可以用 、 来验证版本是否正确。
kubeadm version
kubectl version
systemctl enable kubelet.service # 配置kubelet为开机自启动
版本锁定
锁定这三个软件的版本,避免意外升级导致版本错误。
sudo apt-mark hold kubeadm kubelet kubectl
下载 Kubernetes 组件镜像
组件镜像是放在 自己的镜像仓库网站 ,国内访问不了,需要提前把镜像下载到本地。
Kubernetes
Google
gcr.io
命令 可以查看安装 所需的镜像列表,参数 可以指定版本号:
kubeadm config images list
Kubernetes
--kubernetes-version
kubeadm config images list --kubernetes-version v1.23.3
k8s.gcr.io/kube-apiserver:v1.23.3
k8s.gcr.io/kube-controller-manager:v1.23.3
k8s.gcr.io/kube-scheduler:v1.23.3
k8s.gcr.io/kube-proxy:v1.23.3
k8s.gcr.io/pause:3.6
k8s.gcr.io/etcd:3.5.1-0
k8s.gcr.io/coredns/coredns:v1.8.6
shell 自动化下载镜像
自动化从国内镜像网站下载,然后再用 改名。
shell
docker tag
repo=registry.aliyuncs.com/google_containers
for name in `kubeadm config images list --kubernetes-version v1.23.3`; do
src_name=${name#k8s.gcr.io/}
src_name=${src_name#coredns/}
docker pull $repo/$src_name
docker tag $repo/$src_name $name
docker rmi $repo/$src_name
done
如果国内镜像网站不提供服务,或者修改了镜像,此方法将会失败,请对比所需的镜像列表是否一致。
如果国内镜像网站不提供服务,或者修改了镜像,此方法将会失败,请对比所需的镜像列表是否一致。
修改 kubelet 启动参数
添加 的启动参数, 每个主机都要添加并指定对应的公网 ,添加了这一步才能使用公网 来注册进集群。
kubelet
--node-ip=公网IP
ip
ip
systemctl status kubelet # 查看kubelet运行状态、加载配置文件路径
kubelet.service - kubelet: The Kubernetes Node Agent
Loaded: loaded (/lib/systemd/system/kubelet.service; enabled; vendor preset: enabled)
Drop-In: /etc/systemd/system/kubelet.service.d
└─10-kubeadm.conf
Active: activating (auto-restart) (Result: exit-code) since Wed 2023-03-15 17:57:03 CST; >
Docs: https://kubernetes.io/docs/home/
Process: 14400 ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $K>
Main PID: 14400 (code=exited, status=1/FAILURE)
vim /etc/systemd/system/kubelet.service.d/10-kubeadm.conf
# 最后一行添加公网IP
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $KUBELET_KUBEADM_ARGS $KUBELET_EXTRA_ARGS --node-ip=<公网Ip>
初始化 master 节点
选择一个节点作为master,仅在master节点初始化。
若失败了可以用 重置,删除 后,再 初始化。
选择一个节点作为master,仅在master节点初始化。
若失败了可以用 重置,删除 后,再 初始化。
kubeadm reset
$HOME/.kube
kubeadm init
sudo kubeadm init \
--apiserver-advertise-address=<公网IP> \
--control-plane-endpoint=<公网IP> \
--image-repository registry.cn-hangzhou.aliyuncs.com/google_containers \
--service-cidr=10.10.0.0/16 \
--pod-network-cidr=10.244.0.0/16 \
--kubernetes-version=v1.23.3
# --apiserver-advertise-address: 指定master服务发布的ip地址
# --control-plane-endpoint: 可用于为所有控制平面节点设置共享端点,允许IP地址和可以映射到IP地址的DNS名称,例如 192.168.77.100 master
# --image-repository: 指定镜像源
# --service-cidr: 指定service网络的IP地址范围
# --pod-network-cidr: 指定pod网络的IP地址范围
# --kubernetes-version: 指定k8s版本
因为已经提前把镜像下载到了本地,所以 的安装过程很快就完成了。
kubeadm
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
You can now join any number of control-plane nodes by copying certificate authorities
and service account keys on each node and then running the following as root:
kubeadm join 192.168.77.100:6443 --token m93vq1.xxxxxxxxxxxx \
--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxx201631b982ffc0e7593d4d845e9c916bb7b512081f510 \
--control-plane
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.77.100:6443 --token m93vq1.xxxxxxxxxxxx \
--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxx201631b982ffc0e7593d4d845e9c916bb7b512081f510
按照提示,在本地建立一个 目录,然后拷贝 配置文件,改变文件关联用户组权限。
.kube
kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
提示,其他节点要加入集群必须要用指令里的 和 证书,这条命令需要保存好,在 节点执行。
kubeadm join
token
ca
node
使用 Calico 网络插件
上述 节点初始化后,可以使用 来检查 集群节点状态,当前 节点的状态为 ,这是由于缺少网络插件,集群的内部网络还没有正常运作。
master
kubectl get node
kubernetes
master
NotReady
可以在 的网站(https://www.tigera.io/project-calico/)上找到它的安装方式,需要注意 版本支持适配的 版本。
Calico
Calico
kubernets
wget https://projectcalico.docs.tigera.io/archive/v3.24/manifests/calico.yaml
使用的镜像较大,如果安装超时,可以考虑在每个节点上预先使用 拉取镜像:
Calico
docker pull
# 从calico.yaml文件中,找到需要下载的镜像源
docker pull docker.io/calico/kube-controllers:v3.24.5
docker pull docker.io/calico/node:v3.24.5
docker pull docker.io/calico/pod2daemon-flexvol:v3.24.5
docker pull docker.io/calico/cni:v3.24.5
安装使用 即可:
Calico
kubectl apply
kubectl apply -f calico.yaml
安装 Worker 节点
在 节点机器上,使用 初始化成功后的 命令:
worker
master
join
kubeadm join 192.168.77.100:6443 --token m93vq1.xxxxxxxxxxxx \
--discovery-token-ca-cert-hash sha256:xxxxxxxxxxxx201631b982ffc0e7593d4d845e9c916bb7b512081f510
它会连接 节点,然后拉取镜像,安装网络插件,最后把节点加入集群。
master
如果 命令找不到了,可以创建新的 :
join
token
kubeadm token create --print-join-command
如果遇到拉取镜像的问题,同样使用 下载到本地即可。
docker pull
等 节点完成运行后,在 节点上 可以看到各个节点状态变为 :
worker
master
kubectl get node
Ready
kubectl get node
NAME STATUS ROLES AGE VERSION
master Ready control-plane,master 16h v1.23.3
node1 Ready <none> 15h v1.23.3
node2 Ready <none> 15h v1.23.3