官網教程(部分國外鏡像源下載下傳會逾時)
1. 安裝前調整系統配置
- 主機規劃
主節點1 hostnamectl set-hostname k8s-master01 && bash 主節點2 hostnamectl set-hostname k8s-master02 && bash 工作節點1 hostnamectl set-hostname k8s-node01 && bash # 所有節點的/etc/hosts都要添加,查了下阿裡雲和騰訊雲目前都不支援vip。 # 騰訊雲vpc環境通過keeplived生成的vip, 其他伺服器無法通路,且外網無法通路。 # 是以把vip配置成節點k8s-master01的外網ip,其它都為内網ip cat >> /etc/hosts <<EOF vip www.k8s.com master01_ip k8s-master01 master02_ip k8s-master02 node01_ip k8s-node01 EOF
- 啟用橋接防火牆(透明網橋)功能(所有節點都要執行)
### (CentOS7/Redhat7/Fedora)主機重新開機會自動加載/etc/modules-load.d 目錄下配置檔案裡配置的module cat >/etc/modules-load.d/k8s.conf <<EOF br_netfilter EOF 或者 # modprobe br_netfilter ### 主機重新開機會失效
- 配置核心參數
cat <<EOF > /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_nonlocal_bind = 1 net.ipv4.ip_forward = 1 vm.swappiness=0 EOF sysctl --system
- selinux 和 swap操作
### 檢視selinux 和 swap(所有節點都要操作) cat /etc/selinux/config cat /proc/swaps ### 禁用 selinux 和 swap setenforce 0 swapoff -a
- 啟用ipvs子產品(推薦kube-proxy使用ipvs)
# 檢視ipvs子產品是否啟用 lsmod | grep ip_vs # 如果未啟用,啟用ipvs cat > /etc/sysconfig/modules/ipvs.modules <<EOF #!/bin/bash modprobe -- ip_vs modprobe -- ip_vs_rr modprobe -- ip_vs_wrr modprobe -- ip_vs_sh modprobe -- nf_conntrack_ipv4 EOF chmod +x /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules
2. 安裝docker及k8s元件
- docker安裝教程
- 配置docker驅動為systemd(所有節點都要執行)
cat >/etc/docker/daemon.json <<EOF {"exec-opts":["native.cgroupdriver=systemd"],"registry-mirrors":["https://docker.mirrors.ustc.edu.cn/"]} EOF systemctl reload daemon systemctl restart docker
native.cgroupdriver: docker 驅動(docker 預設的是cgroupfs, kubelet預設的是systemd, 改docker配置和kubelet配置都行,否則叢集起不來。
改kubelet配置相對比較麻煩,kubelet配置檔案是在kubeadm init的時候生成的,需要在kubeadm init / kubeadm john後修改然後重新開機kubelet)
registry-mirrors: 鏡像源
- 建立yum源(谷歌源通路不了,這裡換成阿裡的了)(所有節點都要執行)
cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF
- 安裝kubelet,kubeadm,kubectl(所有節點都要執行,工作節點不用安裝kubectl)
yum install -y kubelet kubeadm kubectl
kubeadm: the command to bootstrap the cluster
kubelet: the component that runs on all of the machines in your cluster and does things like starting pods and containers.
kubectl: the command line util to talk to your cluster(api server).
- 設定kubelet開機自啟動(這裡如果啟動的話會因為沒有kubelet-config配置檔案報錯,kubeadm init 和 kubeadm john 過程中會生成kubelet配置檔案及啟動kubelet)
systemctl enable kubelet
3. 部署keepalived和haproxy
- 參考 高可用_keepalived + haproxy
4. 初始化叢集
- 擷取叢集預設啟動配置并修改(主節點執行)
kubeadm config print init-defaults > kubeadm.yaml vim kubeadm.yaml 内容如下: apiVersion: kubeadm.k8s.io/v1beta2 bootstrapTokens: - groups: - system:bootstrappers:kubeadm:default-node-token token: abcdef.0123456789abcdef ttl: 24h0m0s usages: - signing - authentication kind: InitConfiguration localAPIEndpoint: advertiseAddress: 172.17.0.8 bindPort: 6443 nodeRegistration: criSocket: /var/run/dockershim.sock name: k8s-master01 taints: - effect: NoSchedule key: node-role.kubernetes.io/master --- apiServer: timeoutForControlPlane: 4m0s CertSANs: - vip - "www.k8s.com" apiVersion: kubeadm.k8s.io/v1beta2 certificatesDir: /etc/kubernetes/pki clusterName: kubernetes controlPlaneEndpoint: "www.k8s.com:8443" controllerManager: {} dns: type: CoreDNS etcd: local: dataDir: /var/lib/etcd imageRepository: registry.aliyuncs.com/google_containers kind: ClusterConfiguration kubernetesVersion: v1.20.4 networking: dnsDomain: cluster.local serviceSubnet: 10.96.0.0/12 podSubnet: 10.244.0.0/16 scheduler: {}
- 啟動叢集
kubeadm init --config ./kubeadm.yaml --upload-certs | tee init.log (ERROR FileContent--proc-sys-net-ipv4-ip_forward: echo 1 > /proc/sys/net/ipv4/ip_forward) #如果配置有問題,可以重置,然後重新啟動叢集,節點重新加入叢集前也需要reset。否則無法加入叢集 kubeadm reset && kubeadm init --config ./kubeadm.yaml --upload-certs | tee init.log
advertiseAddress配置成公網,在init的過程中需要調整etcd配置(每次init都會重新生成etcd配置檔案,是以需要在init過程中修改。提前打開兩個視窗)
--upload-certs : 初始化的過程會把證書檔案分發到其他主機節點。
視窗1執行 init
視窗2 修改etcd配置vim /etc/kubernetes/manifests/etcd.yaml
--listen-client-urls=https://0.0.0.0:2379
--listen-peer-urls=https://0.0.0.0:2380
回到視窗1等待啟動完成,注意啟動完成後的提示資訊,如果日志被刷了,可以檢視檔案init.log
- 通過把授權資訊拷貝到$HOME/.kube目錄下,使目前使用者有權限操作叢集(這個授權資訊也是lens需要的);
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
- 檢視叢集資訊
因為還沒有裝網絡插件。coredns相關pod狀态是unready(0)# 檢視叢集配置資訊 kubectl -n kube-system get cm kubeadm-config -o yaml # 檢視節點資訊 kubectl get nodes --show-labels # 檢視pod資訊 kubectl get pods -A # 更多元件資訊檢視 kubectl get --help
- 節點taint(污點)資訊處理
# 檢視節點污點 kubectl describe nodes k8s-master | grep Tain # 有taint的節點隻能作為master節點,不能作為worker節點。 # 如果要在有污點的節點上部署服務需要,待部署服務的配置檔案需要顯示的配置容忍污點 tolerations:(與containers同一層) - key: "node-role.kubernetes.io/master" operator: "Equal" value: "" effect: "NoSchedule" ### 添加污點 kubectl taint node k8s-master01 key=test ### 删除污點 kubectl taint node k8s-master01 key-
4. 安裝網絡插件
- 下載下傳并配置flannel config檔案
# 解決raw.githubusercontent.com被屏蔽的問題 vim /etc/hosts 添加 199.232.68.133 raw.githubusercontent.com # 下載下傳flannel部署檔案(預設flannel鏡像被屏蔽掉了,需要修改下) wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml vim kube-flannel.yml # 找到 image (有兩處) # 替換為 jmgao1983/flannel (通過 docker search flannel 找到的,也可以替換成你想要的其他鏡像) image: jmgao1983/flannel
- 部署 flannel
flanneld 是一個 daemonset 下發到每個節點的 pod,它的作用是搭建網絡(幹道),而 flannel cni 是節點建立的時候,通過 kubernetes-cni 這個 rpm 包安裝的 cni 插件,其被 kubelet 調用,用來為具體的 pod 建立網絡(分枝)。了解這兩者的差別,有助于我們了解 flanneld 和 flannel cni 相關的配置檔案的用途。比如 /run/flannel/subnet.env,是 flanneld 建立的,為 flannel cni 提供輸入的一個環境變量檔案;又比如 /etc/cni/net.d/10-flannel.conf,也是 flanneld pod(準确的說,是 pod 裡的腳本 install-cni)從 pod 裡拷貝到節點目錄,給 flannel cni 使用的子網配置檔案 --- 這段是引用K8s 從懵圈到熟練 – 叢集網絡詳解 便于了解flannel。kubectl apply -f ./kube-flannel.yml
5. 向叢集中添加節點
- 前提條件:待加入節點主機及/etc/hosts已配置,docker已安裝配置,網絡已設定,selinux和swap已禁用,kubeadm/kubelet/kubectl已安裝
-
主節點k8s-master02加入叢集
登入主節點k8s-master02
# k8s-master01 初始叢集後的日志裡有 advertiseAddress需要替換為配置的ip # 本人是在公網ip搭的環境不便暴露 kubeadm join advertiseAddress:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:61e933bd8722ede6eac2b12e02a0527ac4566469344dd74564aaeadc22222ff4 \ --control-plane --certificate-key 5bef349c1fdc0c54c414cba1982d95d5bbc524a825dce8a98e0c6080d44f347f # 如果token過期,可以生成一個新的token kubeadm token create # 檢視token清單 kubeadm token list
-
工作節點k8s-node01,k8s-node02加入叢集
分别登入k8s-node01,k8s-node02
kubeadm join 175.24.121.139:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:61e933bd8722ede6eac2b12e02a0527ac4566469344dd74564aaeadc22222ff4 # 給node節點添加node标簽(支援kubectl的節點上執行) kubectl label nodes k8s-node01 k8s-node02 node-role.kubernetes.io/node=