===============================================
2021/2/6_第2次修改 ccb_warlock
更新說明:
2021/2/6:
1.增加了3.6,kubernetes端口范圍修改的內容
2.在2.3中,增加了禁用swap討論的鏈接地址
===============================================
距離上次接觸kubernetes已經是3年前,當時為了給前公司項目的運維集群框架選型而接觸了幾天,當時還整理了部署手冊(https://www.cnblogs.com/straycats/p/8506959.html)。因為當時對linux和docker的了解較少,且公司項目的規模較小,所以最后選擇了docker swarm。雖然docker官方也明確表示已經放棄swarm,正在主推kubernetes,但是我仍然覺得小項目用swarm也十分合適,框架的層次和操作邏輯都比kubernetes要簡單的多。
目前在做的項目定了以kubernetes作為docker的運維框架,所以我被負責學習和應用基於kubernetes運維demo項目的內容。經過2周的接觸,其實kubernetes沒我之前感覺的那么難學,從yaml部署的角度來說雖然內容比docker swarm豐富很多,但是很多內容共通。所以有着swarm的知識和經驗,學習kubernetes相對來說還較為順利。本次部署原本想部署1.19.x,但是試驗后發現1.19的kube-apiserver的容器始終異常重啟,為了節省時間我試驗了1.18.x和1.20.1正常后,最后選擇用1.20.1作為使用的kubernetes版本。
那么重回kubernetes,還是以部署着手,故先整理部署的內容。我一直認為,做技術一定要踏踏實實,學習並使用別人的東西一定要多動手,會部署是真正會用的第一步。
由於時間所限,暫時沒有時間去學習怎么使用多主多從的集群操作,先整理單master(也就是負載也放在同一個服務器的結構)的內容。后續試驗了多主多從的操作后,再更新負載節點(node)的內容。該篇較於之前(https://www.cnblogs.com/straycats/p/8506959.html)整理國內有網絡的情況下如何部署的內容,不在受限教程提供的離線鏡像包,當kubernetes有新版本也可以通過阿里雲提供的鏡像進行升級(雖然現在通過國內的鏡像服務器拉取k8s.io的鏡像也較為簡單)。
一、部署docker
可以參考:https://www.cnblogs.com/straycats/p/10680502.html
二、配置服務器
2.1 設置各個服務器節點的hostname
# 設置master節點的hostname
hostnamectl --static set-hostname k8s-master01
2.2 修改SELinux
setenforce 0
sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
2.3 關閉swap
kubernetes官方要求禁用交換分區,也就是常說的虛擬內存。
國外也對禁用有不同的意見(https://github.com/kubernetes/kubernetes/issues/53533、https://medium.com/tailwinds-navigator/kubernetes-tip-why-disable-swap-on-linux-3505f0250263),就像前公司買過阿里雲ECS,結果windows的虛擬內存是默認禁用一樣,本質希望完全使用內存來提高運行效率,但是當資源不夠時反而會適得其反。
雖然有很多爭議,但是為了運行正常還是按官方的要求禁用。
swapoff -a
# 修改/etc/fstab文件
vi /etc/fstab
注釋掉swap的自動掛載,wq保存。
#/dev/mapper/centos-swap swap swap defaults 0 0
# 查看內存使用情況
free -m
centos7上的某些用戶報告了由於iptables被繞過而導致流量被錯誤路由的問題。你應該確保net.bridge.bridge-nf-call-iptables在你的sysctl配置中設置為1。試驗下來即使是firewalld的也要修改配置。
cat <<EOF > /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF
sysctl --system
cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg EOF
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
yum list kubeadm --showduplicates | sort -r
yum install -y kubelet-1.20.1-0 kubeadm-1.20.1-0 kubectl-1.20.1-0 --disableexcludes=kubernetes
# 啟動開機啟動kubelet
systemctl start kubelet
systemctl enable kubelet
# 創建集群
kubeadm init \ --kubernetes-version=v1.20.1 \ --pod-network-cidr=10.244.0.0/16 \ --image-repository registry.aliyuncs.com/google_containers \ --apiserver-advertise-address 192.168.3.89 \ --v=6
參數說明:
kubernetes-version:要安裝的版本
pod-network-cidr:負載容器的子網網段
image-repository:指定鏡像倉庫(由於從阿里雲拉鏡像,解決了k8s.gcr.io鏡像拉不下來的問題)
apiserver-advertise-address:節點綁定的服務器ip(多網卡可以用這個參數指定ip)
v=6:這個參數我還沒具體查文檔,用法是初始化過程顯示詳細內容,部署過程如果有問題看詳細信息很多時候能找到問題所在
# 接着根據提示拷貝admin.config的內容到當前用戶的$HOME/.kube/config中並授權(為了使當前用戶使用kubelet操作服務器)
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
上圖中的token信息要記得保留,新節點加入該集群需要使用。
token過期后,新節點要加入該集群,需要在master節點上用下面的命令重新生成token。
kubeadm token create
PS. 如果本地沒有導入k8s.gcr.io的鏡像或沒有配置國內的鏡像庫,會導致卡在“[init] This might take a minute or longer if the control plane images have to be pulled.”,這時候就要先退出重置后,再初始化。
kubeadm reset
rm -rf $HOME/.kube
3.3 查看版本
kubectl version
3.4 安裝flannel
剛部署完節點狀態還不是Ready,需要安裝通信組件,常用有flannel和calico,這里選擇flannel。
mkdir -p /opt/yaml
kube-flannel.yaml
vi /opt/yaml/kube-flannel.yaml
--- apiVersion: policy/v1beta1 kind: PodSecurityPolicy metadata: name: psp.flannel.unprivileged annotations: seccomp.security.alpha.kubernetes.io/allowedProfileNames: docker/default seccomp.security.alpha.kubernetes.io/defaultProfileName: docker/default apparmor.security.beta.kubernetes.io/allowedProfileNames: runtime/default apparmor.security.beta.kubernetes.io/defaultProfileName: runtime/default spec: privileged: false volumes: - configMap - secret - emptyDir - hostPath allowedHostPaths: - pathPrefix: "/etc/cni/net.d" - pathPrefix: "/etc/kube-flannel" - pathPrefix: "/run/flannel" readOnlyRootFilesystem: false # Users and groups runAsUser: rule: RunAsAny supplementalGroups: rule: RunAsAny fsGroup: rule: RunAsAny # Privilege Escalation allowPrivilegeEscalation: false defaultAllowPrivilegeEscalation: false # Capabilities allowedCapabilities: ['NET_ADMIN', 'NET_RAW'] defaultAddCapabilities: [] requiredDropCapabilities: [] # Host namespaces hostPID: false hostIPC: false hostNetwork: true hostPorts: - min: 0 max: 65535 # SELinux seLinux: # SELinux is unused in CaaSP rule: 'RunAsAny' --- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: flannel rules: - apiGroups: ['extensions'] resources: ['podsecuritypolicies'] verbs: ['use'] resourceNames: ['psp.flannel.unprivileged'] - apiGroups: - "" resources: - pods verbs: - get - apiGroups: - "" resources: - nodes verbs: - list - watch - apiGroups: - "" resources: - nodes/status verbs: - patch --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: flannel roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: flannel subjects: - kind: ServiceAccount name: flannel namespace: kube-system --- apiVersion: v1 kind: ServiceAccount metadata: name: flannel namespace: kube-system --- kind: ConfigMap apiVersion: v1 metadata: name: kube-flannel-cfg namespace: kube-system labels: tier: node app: flannel data: cni-conf.json: | { "name": "cbr0", "cniVersion": "0.3.1", "plugins": [ { "type": "flannel", "delegate": { "hairpinMode": true, "isDefaultGateway": true } }, { "type": "portmap", "capabilities": { "portMappings": true } } ] } net-conf.json: | { "Network": "10.244.0.0/16", "Backend": { "Type": "vxlan" } } --- apiVersion: apps/v1 kind: DaemonSet metadata: name: kube-flannel-ds namespace: kube-system labels: tier: node app: flannel spec: selector: matchLabels: app: flannel template: metadata: labels: tier: node app: flannel spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/os operator: In values: - linux hostNetwork: true priorityClassName: system-node-critical tolerations: - operator: Exists effect: NoSchedule serviceAccountName: flannel initContainers: - name: install-cni image: quay.io/coreos/flannel:v0.13.1-rc1 command: - cp args: - -f - /etc/kube-flannel/cni-conf.json - /etc/cni/net.d/10-flannel.conflist volumeMounts: - name: cni mountPath: /etc/cni/net.d - name: flannel-cfg mountPath: /etc/kube-flannel/ containers: - name: kube-flannel image: quay.io/coreos/flannel:v0.13.1-rc1 command: - /opt/bin/flanneld args: - --ip-masq - --kube-subnet-mgr resources: requests: cpu: "100m" memory: "50Mi" limits: cpu: "100m" memory: "50Mi" securityContext: privileged: false capabilities: add: ["NET_ADMIN", "NET_RAW"] env: - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: POD_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace volumeMounts: - name: run mountPath: /run/flannel - name: flannel-cfg mountPath: /etc/kube-flannel/ volumes: - name: run hostPath: path: /run/flannel - name: cni hostPath: path: /etc/cni/net.d - name: flannel-cfg configMap: name: kube-flannel-cfg
sed -i 's#quay.io/coreos/flannel#quay.mirrors.ustc.edu.cn/coreos/flannel#' /opt/yaml/kube-flannel.yaml
# 部署flannel
kubectl apply -f /opt/yaml/kube-flannel.yaml
再查看節點可以看到已經是ready了。
3.5 單節點集群
如果是部署單節點集群(需要master節點也當作node節點負載應用),可以執行下面的命令將所有節點都去除污點標簽(node-role.kubernetes.io/master-)
kubectl taint nodes --all node-role.kubernetes.io/master-
如果需要恢復該節點(k8s-master01)為master only,可以添加污點標簽
kubectl taint node k8s-master01 node-role.kubernetes.io/master=""
3.6 修改kube-apiserver的端口范圍
kubernetes默認的端口范圍:30000 - 32768,如果使用默認配置,則無法與這個范圍以外的宿主機端口做映射,可以通過以下操作來修改端口范圍。
# 編輯kube-apiserver配置文件
vi /etc/kubernetes/manifests/kube-apiserver.yaml
如下,在command.kube-apiserver中增加service-node-port-range項,wq保存。
- command: - kube-apiserver - --service-node-port-range=1-65535
接着刪除kube-apiserver的pod即可(kubernetes會創建新pod),因為我這宿主機的hostname設置為了k8s-master01,故我使用下面的命令刪除:
kubectl delete pod kube-apiserver-k8s-master01 -n kube-system
四、部署Node節點
以后補上。
參考資料:
1.https://kubernetes.io/zh/docs/setup/production-environment/tools/kubeadm/install-kubeadm/
2.https://www.jianshu.com/p/25c01cae990c
3.https://blog.csdn.net/zhaoydzhaoyd/article/details/111141273
4.https://blog.csdn.net/qq_41475058/article/details/88849291
5.https://www.jianshu.com/p/63f7f5c021e4