运维之路-极简K8s安装v1.29.15(Docker版)

4 阅读3分钟

K8s是现在运维必备的一项技能,最近也在学习和了解,那么先从最简单的安装开始。

1.修改Host映射(所有主机都需要做)

root@master233:~# cat >> /etc/hosts <<EOF 
192.168.1.233 master233
192.168.1.234 slave234
192.168.1.235 slave235
EOF

2.安装软件(所有主机都需要做)

root@master233:~#  apt-get update && sudo apt-get install -y apt-transport-https ca-certificates vim curl gpg ntpdate

3.时间同步设置(所有主机都需要做)

root@master233:~# ntpdate time1.aliyun.com
root@master233:~# timedatectl set-timezone Asia/Shanghai
root@master233:~# crontab -e
0 0 * * * ntp.aliyun.com

4.关闭交换分区(所有主机都需要做)

root@master233:~# sed -i '/swap/s/^/# /' /etc/fstab && swapoff -a

5.调整内核参数&开启转发(所有主机都需要做)

# 调整内核参数
root@master233:~# cat << EOF |tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
overlay
br_netfilter
# 加载
root@master233:~# modprobe overlay
root@master233:~# modprobe br_netfilter

# 查看是否成功
root@master233:~# lsmod | egrep "overlay"
overlay               151552  0
root@master233:~# lsmod | egrep "br_netfilter"
br_netfilter           32768  0
bridge                311296  1 br_netfilter

# 开启内核转发
root@master233:~# 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
EOF
# 加载
sysctl -p /etc/sysctl.d/k8s.conf
sysctl --system
# 查看是否加载成功
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward

# 安装IPVS
root@master233:~# apt install ipset ipvsadm -y
root@master233:~# cat<< EOF |tee /etc/modules-load.d/ipvs.conf
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack
EOF

root@master233:~# cat << EOF |tee ipvs.sh
#!/bin/sh
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
EOF

root@master233:~# bash ipvs.sh

# 查看加载情况
root@master233:~# lsmod | grep ip_vs

6.安装Docker及cri-docker(所有主机都需要做)

root@master233:~# apt-get -y install apt-transport-https ca-certificates curl software-properties-common
root@master233:~# curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
root@master233:~# add-apt-repository "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
root@master233:~# apt-get -y update
root@master233:~# apt-get -y install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

root@master233:~# curl -LO https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.21/cri-dockerd_0.3.21.3-0.ubuntu-jammy_amd64.deb
root@master233:~# dpkg -i cri-dockerd_0.3.21.3-0.ubuntu-jammy_amd64.deb  
root@master233:~# systemctl enable --now cri-docker

7.安装K8s(所有主机都需要做)

# 使用阿里源
root@master233:~# curl -fsSL https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/deb/Release.key | gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
root@master233:~# echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.29/deb/ /" | tee /etc/apt/sources.list.d/kubernetes.list
# 更新源
root@master233:~# apt-get update
# 安装1.29
root@master233:~# apt-get install -y kubelet kubeadm kubectl
# 锁定版本
root@master233:~# apt-mark hold kubelet kubeadm kubectl

8.更新kubelet配置(所有主机都需要做)

root@master233:~# vi /etc/default/kubelet
KUBELET_EXTRA_ARGS="--cgroup-driver=systemd"
root@master233:~# systemctl enable kubelet

9.kubectl命令补全(所有主机都需要做)

root@master233:~# apt install -y bash-completion
root@master233:~# echo'source <(kubectl completion bash)' >>~/.bashrc  

10.修改Cri的k8s沙箱(所有主机都需要做)

root@master233:~# sed -i.bak '/^ExecStart/c ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --network-plugin=cni --cni-bin-dir=/opt/cni/bin --cni-cache-dir=/var/lib/cni/cache --cni-conf-dir=/etc/cni/net.d --pod-infra-container-image=registry.aliyuncs.com/google_containers/pause:3.10.1' /lib/systemd/system/cri-docker.service
root@master233:~# systemctl daemon-reload && systemctl restart cri-docker.service

11.主节点初始化(只有Master操作)

root@master233:~# kubeadm config print init-defaults > kubeadm-init-config.yaml
root@master233:~# vi kubeadm-init-config.yaml
apiVersion: kubeadm.k8s.io/v1beta3
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
localAPIEndpoint:
  advertiseAddress192.168.1.233 # master ip
  bindPort6443
nodeRegistration:
  criSocketunix:///run/cri-dockerd.sock
  imagePullPolicy: IfNotPresent
  name: master233 # master 主机名
  taints: null
---
apiServer:
  timeoutForControlPlane4m0s
apiVersion: kubeadm.k8s.io/v1beta3
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns: {}
etcd:
  local:
    dataDir: /var/lib/etcd
imageRepository: registry.aliyuncs.com/google_containers # 镜像仓库
kind: ClusterConfiguration
kubernetesVersion: 1.29.15 # k8s版本
networking:
  dnsDomain: cluster.local
  serviceSubnet: 10.96.0.0/12
  podSubnet: 10.244.0.0/16 # 增加pod子网
scheduler: {}

12.下载镜像(只有Master操作)

root@master233:~# kubeadm config images pull --config ./kubeadm-init-config.yaml
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-apiserver:v1.29.15
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-controller-manager:v1.29.15
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-scheduler:v1.29.15
[config/images] Pulled registry.aliyuncs.com/google_containers/kube-proxy:v1.29.15
[config/images] Pulled registry.aliyuncs.com/google_containers/coredns:v1.11.1
[config/images] Pulled registry.aliyuncs.com/google_containers/pause:3.9 # 这个不用在意 初始化的时候会变成3.10版本
[config/images] Pulled registry.aliyuncs.com/google_containers/etcd:3.5.16-0

13.初始化K8s(只有Master操作)

root@master233:~# kubeadm init --config ./kubeadm-init-config.yaml
[init] Using Kubernetes version: v1.29.15
.....
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/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.1.233:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:fdc14f28184833db07b0677cea087b9a63926c4b9f3aa803f66de7657c386e84
    
root@master233:~# mkdir -p $HOME/.kube
root@master233:~# cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
root@master233:~# chown $(id -u):$(id -g) $HOME/.kube/config

14.从节点加入(只有Slave操作)

root@slave234:~# kubeadm join 192.168.1.233:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:fdc14f28184833db07b0677cea087b9a63926c4b9f3aa803f66de7657c386e84 \
    --cri-socket unix:///var/run/cri-dockerd.sock
[preflight] Running pre-flight checks
.....

root@slave235:~# kubeadm join 192.168.1.233:6443 --token abcdef.0123456789abcdef \
    --discovery-token-ca-cert-hash sha256:fdc14f28184833db07b0677cea087b9a63926c4b9f3aa803f66de7657c386e84 \
    --cri-socket unix:///var/run/cri-dockerd.sock
[preflight] Running pre-flight checks
.....

15.安装网络插件flannel

root@master233:~# kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
root@master233:~# kubectl get pod -n kube-flannel
NAME                    READY   STATUS    RESTARTS   AGE
kube-flannel-ds-6f57x   1/1     Running   0          51s
kube-flannel-ds-87qqt   1/1     Running   0          51s
kube-flannel-ds-8lg6h   1/1     Running   0          51s

16.查看K8s状态

root@master233:~# kubectl get node
NAME        STATUS   ROLES           AGE     VERSION
master233   Ready    control-plane   26m     v1.29.15
slave234    Ready    <none>          4m37s   v1.29.15
slave235    Ready    <none>          4m30s   v1.29.15