为了简化 Kubernetes 的部署,让k8s能够更“接地气”,社区里就出现了一个专门用来在集群中安装 Kubernetes 的工具,名字就叫“kubeadm”,意思就是“Kubernetes 管理员”。
kubeadm用容器和镜像来封装 Kubernetes 的各种组件,但它的目标不是单机部署,而是要能够轻松地在集群环境里部署 Kubernetes,并且让这个集群接近甚至达到生产级质量。
本次安装的的k8s版本为1.23.3,是k8s最后一个支持 docker的版本
系统架构
准备
1. 修改主机名
k8s使用主机名来区分集群里的节点,所以每个节点的hostname必须不能重名。
修改“/etc/hostname”这个文件,把它改成容易识别的名字,分别为master、worker。
机器配置如下:
master节点配置
- CPU:2核
- 内存:4G
- 硬盘:20G
- ip地址设置为:192.168.56.202
worker节点配置
- CPU:1核
- 内存:1G
- 硬盘:20G
- ip地址设置为:192.168.56.203
linux发行版:Ubuntu 22.04.1
2. 安装docker
sudo apt install -y docker.io
启动docker
sudo service docker start
当前用户加入docker组
sudo usermod -aG docker ${USER}
查看docker版本
docker version
修改/etc/docker/daemon.json
cat <<EOF | sudo tee /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
EOF
sudo systemctl enable docker
sudo systemctl daemon-reload
sudo systemctl restart docker
3. 修改Ubuntu网络配置
为了让 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
4. 关闭Linux的swap分区
提升 Kubernetes 的性能
sudo swapoff -a
sudo sed -ri '/\sswap\s/s/^#?/#/' /etc/fstab
上述步骤,设置完成后,重启下操作系统,并做好系统快照
安装
1. 安装kubeadm
a. 添加软件仓库源
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
b. 安装kubeadm
sudo apt install -y kubeadm=1.23.3-00 kubelet=1.23.3-00 kubectl=1.23.3-00
c. 查看kubeadm版本
kubeadm version
kubectl version --client
d. 锁定kubeadm软件的版本
使用apt-mark hold ,锁定这三个软件的版本,避免意外升级导致版本错误
sudo apt-mark hold kubeadm kubelet kubectl
2. 提前下载用到的容器镜像
查看kubernetes 1.23.3需要的镜像
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
以容器的方式启动 Kubernetes,这些镜像不是放在 Docker Hub 上
而是放在 Google 自己的镜像仓库网站 gcr.io,而它在国内的访问很困难,直接拉取镜像几乎是不可能的。
从国内的镜像网站下载然后再用 docker tag 改名,能够使用 Shell 编程实现自动化
执行images.sh脚本提前下载需要的镜像
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
添加执行权限
chmod u+x images.sh
执行脚本,下载master节点需要镜像
./images.sh
3. 安装master节点
kubeadm 的用法非常简单,只需要一个命令 kubeadm init 就可以把组件在 Master 节点上运行起来。
--pod-network-cidr,设置集群里 Pod 的 IP 地址段。
--apiserver-advertise-address,设置 apiserver 的 IP 地址,对于多网卡服务器来说很重要(比如 VirtualBox 虚拟机就用了两块网卡),可以指定 apiserver 在哪个网卡上对外提供服务。
--kubernetes-version,指定 Kubernetes 的版本号。
sudo kubeadm init \
--pod-network-cidr=10.10.0.0/16 \
--apiserver-advertise-address=192.168.56.202 \
--kubernetes-version=v1.23.3
kubeadm 的安装过程很快就完成了,它还会提示出接下来要做的工作:
a. 在本地建立一个“.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
b. 还有一个很重要的“kubeadm join”提示,其他节点要加入集群必须要用指令里的 token 和 ca 证书
kubeadm join 192.168.10.210:6443 --token tv9mkx.tw7it9vphe158e74 \
--discovery-token-ca-cert-hash sha256:e8721b8630d5b562e23c010c70559a6d3084f629abad6a2920e87855f8fb96f3
c. 安装完成后,可以使用 kubectl version、kubectl get node 来检查Kubernetes 的版本和集群的节点状态了
kubectl version
kubectl get node
Master 节点的状态是“NotReady”,这是由于还缺少网络插件,集群的内部网络还没有正常运作
d. 安装flannel网络插件
Kubernetes 定义了 CNI 标准,有很多网络插件,
本次选择 Flannel,可以在它的 GitHub 仓库里 https://github.com/flannel-io/flannel下载
修改kube-flanner.yml文件内容
net-conf.json: |
{
"Network": "10.10.0.0/16",
"Backend": {
"Type": "vxlan"
}
}
多网卡环境下 flannel 网络插件会出现DNS 无法解析,因此需要调整下 flannel 的启动参数,加上 - --iface=eth1 网卡参数:- --kube-subnet-mgr 后面加一行参数:- --iface=eth1
注意eth1 ,可能网卡名称不是eth1,可以使用ip addr查看
containers:
- name: kube-flannel
image: quay.io/coreos/flannel:v0.11.0-amd64
command:
- /opt/bin/flanneld
args:
- --ip-masq
- --kube-subnet-mgr
- --iface=eth1
修改后使用kubectl apply -f kube-flannel.yml来安装 Flannel 网络了。
稍等一小会,再次使用kubectl get node来看节点状态,应该能够看到 Master 节点的状态是“Ready”
4. 安装worker节点
提前下载安装需要的镜像
images.sh内容如下:
repo=registry.aliyuncs.com/google_containers
for name in `kubeadm config images list --kubernetes-version v1.23.3`;
do
# remove prefix
src_name=${name#k8s.gcr.io/}
src_name=${src_name#coredns/}
# worker only needs kube-proxy/pause
if [[ "$src_name" =~ "kube-proxy" ]] ||
[[ "$src_name" =~ "pause" ]] ||
[[ "$src_name" =~ "coredns" ]] ; then
docker pull $repo/$src_name
# rename to fit k8s
docker tag $repo/$src_name $name
docker rmi $repo/$src_name
fi
done
# enable network
docker pull rancher/mirrored-flannelcni-flannel-cni-plugin:v1.0.1
docker pull rancher/mirrored-flannelcni-flannel:v0.17.0
添加执行权限
chmod u+x images.sh
运行脚本,下载worker节点需要的镜像
./images.sh
安装
如果成功安装了 Master 节点,那么 Worker 节点的安装就简单多了,只需要用之前拷贝的那条 kubeadm join 命令就可以了,记得要用 sudo 来执行:
kubeadm join 192.168.56.202:6443 --token tv9mkx.tw7it9vphe158e74 \
--discovery-token-ca-cert-hash sha256:e8721b8630d5b562e23c010c70559a6d3084f629abad6a2920e87855f8fb96f3
Worker 节点安装完毕后,执行 kubectl get node ,就会看到两个节点都是“Ready”状态
5. 测试
kubectl run ,运行 Nginx 来测试一下
kubectl run ngx --image=nginx:alpine
kubectl get pod -o wide
希望本篇文章对你有所帮助,谢谢。