背景
服务器配置
| 节点 | 内网IP | 公网IP | 配置 |
|---|---|---|---|
| ds-2 | 10.80.239.78 | 无 | 4C16G |
| ds-8 | 10.80.239.84 | 无 | 4C16G |
| ds-9 | 10.80.239.85 | 无 | 4C16G |
| ds-10 | 10.80.239.86 | 无 | 4C16G |
| ds-11 | 10.80.239.87 | 无 | 4C16G |
软件版本
| 软件 | 版本 |
|---|---|
| centos | 7.6 |
| docker | 20.10.7 |
| kubelet | 1.20.9 |
| kubeadm | 1.20.9 |
| kubectl | 1.20.9 |
镜像版本
| 镜像 | 版本 |
|---|---|
| k8s.gcr.io/kube-apiserver | 1.20.9 |
| k8s.gcr.io/kube-controller-manager | 1.20.9 |
| k8s.gcr.io/kube-scheduler | 1.20.9 |
| k8s.gcr.io/kube-proxy | 1.20.9 |
| k8s.gcr.io/pause | 3.2 |
| k8s.gcr.io/etcd | 3.4.13-0 |
| k8s.gcr.io/coredns | 1.7.0 |
创建初始文件夹
#/Users/keyboardone/同步空间/softwaremkdir -p /opt/softwarecd /opt/software/k8s/chmod 755 /opt/software/k8s/*.sh
配置ssh免密
ds-2
ds-2.sh
cd /opt/software/k8s/vi ds-2.sh
#修改主机名sudo hostnamectl set-hostname ds-2sudo hostnamectl set-hostname "ds-2" --prettysudo hostnamectl set-hostname ds-2 --staticsudo hostnamectl set-hostname ds-2 --transient#标识其他主机名cat > /etc/hosts <<EOF127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4::1 localhost localhost.localdomain localhost6 localhost6.localdomain610.80.239.78 ds-210.80.239.84 ds-810.80.239.85 ds-910.80.239.86 ds-1010.80.239.87 ds-11EOF#清空密钥cd ~/.ssh/rm -rf *#用户目录下生成公钥、私钥文件ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsacat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keyschmod 600 ~/.ssh/authorized_keys#分发公钥到其他主机for ip in ds-8 ds-9 ds-10 ds-11; # 请将此处主机名替换为自己要部署的机器的 hostnamedossh-copy-id $ip # 该操作执行过程中需要手动输入用户的密码done
ds-8
ds-8.sh
cd /opt/software/k8s/vi ds-8.sh
#修改主机名sudo hostnamectl set-hostname ds-8sudo hostnamectl set-hostname "ds-8" --prettysudo hostnamectl set-hostname ds-8 --staticsudo hostnamectl set-hostname ds-8 --transient#标识其他主机名cat > /etc/hosts <<EOF127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4::1 localhost localhost.localdomain localhost6 localhost6.localdomain610.80.239.78 ds-210.80.239.84 ds-810.80.239.85 ds-910.80.239.86 ds-1010.80.239.87 ds-11EOF#清空密钥cd ~/.ssh/rm -rf *#用户目录下生成公钥、私钥文件ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsacat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keyschmod 600 ~/.ssh/authorized_keys#分发公钥到其他主机for ip in ds-2 ds-9 ds-10 ds-11; # 请将此处主机名替换为自己要部署的机器的 hostnamedossh-copy-id $ip # 该操作执行过程中需要手动输入用户的密码done
ds-9
ds-9.sh
cd /opt/software/k8s/vi ds-9.sh
#修改主机名sudo hostnamectl set-hostname ds-9sudo hostnamectl set-hostname "ds-9" --prettysudo hostnamectl set-hostname ds-9 --staticsudo hostnamectl set-hostname ds-9 --transient#标识其他主机名cat > /etc/hosts <<EOF127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4::1 localhost localhost.localdomain localhost6 localhost6.localdomain610.80.239.78 ds-210.80.239.84 ds-810.80.239.85 ds-910.80.239.86 ds-1010.80.239.87 ds-11EOF#清空密钥cd ~/.ssh/rm -rf *#用户目录下生成公钥、私钥文件ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsacat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keyschmod 600 ~/.ssh/authorized_keys#分发公钥到其他主机for ip in ds-2 ds-8 ds-10 ds-11; # 请将此处主机名替换为自己要部署的机器的 hostnamedossh-copy-id $ip # 该操作执行过程中需要手动输入用户的密码done
ds-10
ds-10.sh
cd /opt/software/k8s/vi ds-10.sh
#修改主机名sudo hostnamectl set-hostname ds-10sudo hostnamectl set-hostname "ds-10" --prettysudo hostnamectl set-hostname ds-10 --staticsudo hostnamectl set-hostname ds-10 --transient#标识其他主机名cat > /etc/hosts <<EOF127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4::1 localhost localhost.localdomain localhost6 localhost6.localdomain610.80.239.78 ds-210.80.239.84 ds-810.80.239.85 ds-910.80.239.86 ds-1010.80.239.87 ds-11EOF#清空密钥cd ~/.ssh/rm -rf *#用户目录下生成公钥、私钥文件ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsacat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keyschmod 600 ~/.ssh/authorized_keys#分发公钥到其他主机for ip in ds-2 ds-8 ds-9 ds-11; # 请将此处主机名替换为自己要部署的机器的 hostnamedossh-copy-id $ip # 该操作执行过程中需要手动输入用户的密码done
ds-11
ds-11.sh
cd /opt/software/k8s/vi ds-11.sh
#修改主机名sudo hostnamectl set-hostname ds-11sudo hostnamectl set-hostname "ds-11" --prettysudo hostnamectl set-hostname ds-11 --staticsudo hostnamectl set-hostname ds-11 --transient#标识其他主机名cat > /etc/hosts <<EOF127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4::1 localhost localhost.localdomain localhost6 localhost6.localdomain610.80.239.78 ds-210.80.239.84 ds-810.80.239.85 ds-910.80.239.86 ds-1010.80.239.87 ds-11EOF#清空密钥cd ~/.ssh/rm -rf *#用户目录下生成公钥、私钥文件ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsacat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keyschmod 600 ~/.ssh/authorized_keys#分发公钥到其他主机for ip in ds-2 ds-8 ds-9 ds-10; # 请将此处主机名替换为自己要部署的机器的 hostnamedossh-copy-id $ip # 该操作执行过程中需要手动输入用户的密码done
文件准备
上传相关文件到 /opt/software/
分发
scp -r /opt/software/ ds-8:/opt/scp -r /opt/software/ ds-9:/opt/scp -r /opt/software/ ds-10:/opt/scp -r /opt/software/ ds-11:/opt/
安装docker
rpm版(依赖epel)
#安装yum存储库yum install -y epel-release.noarch#安装Docker Yum源yum -y install yum-utilsyum-config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo#rpm离线安装cd /opt/software/offline_package/dockerrpm -ivh --replacefiles --replacepkgs *.rpm#启动Dockersystemctl enable docker.servicesystemctl start docker.service
tar版
#安装dockercd /opt/software/dockertar xzvf docker-20.10.7.tgzchmod +x docker/*mv docker/* /usr/local/bin/#创建docker配置文件echo '[Unit]Description=Docker Application Container EngineDocumentation=http://docs.docker.ioAfter=network.target[Service]Environment="PATH=/usr/local/bin:/bin:/sbin:/usr/bin:/usr/sbin"ExecStart=/usr/local/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375ExecReload=/bin/kill -s HUP $MAINPIDRestart=alwaysRestartSec=5TimeoutSec=0LimitNOFILE=infinityLimitNPROC=infinityLimitCORE=infinityDelegate=yesKillMode=process[Install]WantedBy=multi-user.target' >> /etc/systemd/system/docker.service#重新加载docker配置文件cd /usr/local/bin#重新加载配置文件systemctl daemon-reload#设置开机启动systemctl enable docker.service#启动systemctl start docker.service#重启systemctl daemon-reloadsystemctl restart docker#等待sleep 30s#添加docker源mkdir -p /etc/docker/touch /etc/docker/daemon.jsoncat > /etc/docker/daemon.json <<EOF{"registry-mirrors":["https://docker.mirrors.ustc.edu.cn/"],"exec-opts": ["native.cgroupdriver=systemd"],"insecure-registries": ["http://ren:8088"]}EOF#重启dockersystemctl daemon-reloadsystemctl restart docker#等待sleep 1m#查看验证dockerdocker info
安装Kubernetes
加载Kubernetes镜像
#加载Kubernetes镜像docker load -i /opt/software/images/k8simages.tar#恢复镜像名称及tagwhile read REPOSITORY TAG IMAGE_IDdoecho "== Tagging $REPOSITORY $TAG $IMAGE_ID =="docker tag "$IMAGE_ID" "$REPOSITORY:$TAG"done < /opt/software/images/k8simages.list
设置Kubernetes对应内核参数
#设置Kubernetes对应内核参数cat > /etc/sysctl.d/kubernetes.conf << EOFnet.ipv4.ip_forward = 1net.bridge.bridge-nf-call-ip6tables = 1net.bridge.bridge-nf-call-iptables = 1EOF
重新加载参数
#重新加载参数modprobe br_netfiltersysctl --system
关闭swap区
#关闭swap区swapoff -ased -e '/swap/s/^/#/g' -i /etc/fstab
关闭SELinux
#关闭SELinuxgetenforcesestatussetenforce 0getenforcesestatus
rpm离线安装
#添加yum源cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64enabled=1gpgcheck=0repo_gpgcheck=0gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpghttp://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpgexclude=kubelet kubeadm kubectlEOF#安装离线包systemctl stop firewalldcd /opt/software/offline_package/k8srpm -ivh --replacefiles --replacepkgs /opt/software/offline_package/k8s/*.rpm
bash中启用kubectl
#bash中启用kubectlkubectl completion bash > /etc/bash_completion.d/kubectl
确认主节点的kubelet服务状态
#初始化Kubernetes主节点systemctl status kubeletsystemctl daemon-reloadsudo systemctl enable --now kubeletsystemctl status kubelet
使用 kubeadm 引导集群
所有节点执行
#所有机器添加master域名映射,以下需要修改为自己的echo "10.80.239.78 cluster-endpoint" >> /etc/hosts
主节点执行
kubeadm init \--apiserver-advertise-address=10.80.239.78 \--control-plane-endpoint=cluster-endpoint \--image-repository k8s.gcr.io \--kubernetes-version v1.20.9 \--service-cidr=10.96.0.0/16 \--pod-network-cidr=192.168.0.0/16
得到
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/.kubesudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/configsudo chown $(id -u):$(id -g) $HOME/.kube/configAlternatively, if you are the root user, you can run:export KUBECONFIG=/etc/kubernetes/admin.confYou 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 authoritiesand service account keys on each node and then running the following as root:kubeadm join cluster-endpoint:6443 --token yee1e9.8nrqge5yc5xsftbi \--discovery-token-ca-cert-hash sha256:2767e227965196fef7ac8831c12b67ac6d9babbc6e25f41b6560f48e5651eab4 \--control-planeThen you can join any number of worker nodes by running the following on each as root:kubeadm join cluster-endpoint:6443 --token yee1e9.8nrqge5yc5xsftbi \--discovery-token-ca-cert-hash sha256:2767e227965196fef7ac8831c12b67ac6d9babbc6e25f41b6560f48e5651eab4
主节点执行建议脚本
#执行建议脚本mkdir -p $HOME/.kubecp -i /etc/kubernetes/admin.conf $HOME/.kube/configchown $(id -u):$(id -g) $HOME/.kube/config
确认从节点的kubelet服务状态
#初始化Kubernetes从节点systemctl status kubeletsystemctl daemon-reloadsudo systemctl enable --now kubeletsystemctl status kubelet
从节点执行命令加入k8s集群
kubeadm join cluster-endpoint:6443 --token yee1e9.8nrqge5yc5xsftbi \--discovery-token-ca-cert-hash sha256:2767e227965196fef7ac8831c12b67ac6d9babbc6e25f41b6560f48e5651eab4
安装calico
上传文件
kubectl apply -f calico.yaml
查看初始化进度
#监听应用启动情况kubectl get pod -A -w#或者watch -n 1 kubectl get pod -A#检查各节点连接状态kubectl get pods -o wide --all-namespaces#或者watch -n 1 kubectl get pods -o wide --all-namespaces
