kubernetes之3---kubeadm部署k8s叢集
阿新 • • 發佈:2021-01-03
kubeadm部署k8s叢集
目錄環境準備
主機 | IP | 配置 | 軟體 |
---|---|---|---|
k8s-adm-master | 10.0.0.15 | 2核2G | docker-ce,kubelet,kubeadm,kubectl |
k8s-adm-node1 | 10.0.0.16 | 2核2G | docker-ce,kubelet,kubeadm,kubectl |
-
關閉:
selinux
firewalld
和NetworkManager
,postfix
(非必須) -
修改IP地址、主機名
hostnamectl set-hostname 主機名
sed -i 's/200/IP/g' /etc/sysconfig/network-scripts/ifcfg-eth0
- 新增hosts解析
cat > /etc/hosts <<EOF 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.0.0.15 k8s-adm-master 10.0.0.16 k8s-adm-node1 EOF
- 修改核心引數,關閉swap分割槽
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
swapoff -a
sed -i 's%/dev/mapper/centos-swap%#&%g' /etc/fstab
安裝docker-ce
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo yum install docker-ce-18.09.7 -y systemctl enable docker.service systemctl start docker.service systemctl start docker cat > /etc/docker/daemon.json <<EOF { "registry-mirrors": ["https://registry.docker-cn.com"], } EOF systemctl restart docker.service docker info
安裝kubeadm
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 install kubelet-1.15.4-0 kubeadm-1.15.4-0 kubectl-1.15.4-0 -y
systemctl enable kubelet.service
systemctl start kubelet.service
使用kubeadm初始化k8s叢集
- 選擇一個控制節點(k8s-adm-master),初始化一個k8s叢集:
kubeadm init --kubernetes-version=v1.15.4 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16 --service-cidr=10.254.0.0/16
- 等待映象下載,可以使用
docker images
檢視下載進度。 - Your Kubernetes control-plane has initialized successfully!
- 執行提示命令1:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
- 執行提示命令2:node節點加入k8s叢集
kubeadm join 10.0.0.15:6443 --token uwelrl.g25p8ye1q9m2sfk7 \
--discovery-token-ca-cert-hash sha256:e598a2895a53fded82d808caf9b9fd65a04ff59a5b773696d8ceb799cac93c5e
預設 token 24H過期,需要重新生成
kubeadm token create --print-join-command
預設 證書 10年過期,檢視
cfssl-certinfo -cert /etc/kubernetes/pki/ca.crt
- kubectl命令列TAB鍵補全:
echo "source <(kubectl completion bash)" >> ~/.bashrc
master節點配置flannel網路
- 準備yaml檔案
cat <<EOF >> /etc/hosts
199.232.4.133 raw.githubusercontent.com
EOF
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
- 建立資源
kubectl create -f kube-flannel.yml
- 檢視資源
kubectl get all -n kube-system
kubectl get nodes
metric-server
-
準備yaml檔案,使用國內映象地址(2個),修改一些其他引數
-
建立資源(準備映象:registry.aliyuncs.com/google_containers/addon-resizer:1.8.5和registry.aliyuncs.com/google_containers/metrics-server-amd64:v0.3.3)
kubectl create -f .
- 檢視資源監控
kubectl top nodes
匯出所有映象
docker save `docker images|awk 'NR>1{print $1":"$2}'|xargs -n 50` -o docker_k8s_kubeadm.tar.gz
彈性伸縮
- 建立業務資源
kubectl create -f /root/k8s_yaml/deploy/k8s_deploy2.yaml
- 建立HPA規則
kubectl autoscale deploy nginx --max=6 --min=1 --cpu-percent=5
- 檢視pod
kubectl get pod
- 建立service和ingress資源,部署dashboard服務,ab壓力測試彈性伸縮。
StatefulSet 資源
StatefulSet (PetSets):寵物應用,有狀態的應用,有資料的應用,pod名稱固定(有序 01 02 03)。
- 適用於每個Pod中有自己的編號,需要互相訪問,以及持久儲存區分。
- 例如資料庫應用,redis,es叢集,mysql叢集。
StatefulSet 用來管理 Deployment 和擴充套件一組 Pod,並且能為這些 Pod 提供序號和唯一性保證。
StatefulSet 為它的每個 Pod 維護了一個固定的 ID。這些 Pod 是基於相同的宣告來建立的,但是不能相互替換:無論怎麼排程,每個 Pod 都有一個永久不變的 ID。
StatefulSets 對於需要滿足以下一個或多個需求的應用程式很有價值:
- 穩定的、唯一的網路識別符號。
$(StatefulSet 名稱)-$(序號)
- 穩定的、持久的儲存。
- 有序的、優雅的部署和縮放。
- 有序的、自動的滾動更新。
使用限制
- 給定 Pod 的儲存必須由 PersistentVolume 驅動基於所請求的
storage class
來提供,或者由管理員預先提供。 - 刪除或者收縮 StatefulSet 並不會刪除它關聯的儲存卷。保證資料安全。
- StatefulSet 當前需要無頭服務(不分配 ClusterIP的 svc 資源)來負責 Pod 的網路標識。需要預先建立此服務。
- 有序和優雅的終止 StatefulSet 中的 Pod ,在刪除前將 StatefulSet 縮放為 0。
- 預設 Pod 管理策略(
OrderedReady
) 使用滾動更新,可能進入損壞狀態,需要手工修復。
- 搭建NFS提供靜態儲存
- 配置動態儲存
mkdir -p /root/k8s_yaml/sts/ && cd /root/k8s_yaml/sts/
# 實現自動建立PV功能,提供儲存類SC
cat > /root/k8s_yaml/sts/nfs-client.yaml <<EOF
kind: Deployment
apiVersion: apps/v1
metadata:
name: nfs-client-provisioner
spec:
replicas: 1
strategy:
type: Recreate
selector:
matchLabels:
app: nfs-client-provisioner
template:
metadata:
labels:
app: nfs-client-provisioner
spec:
serviceAccountName: nfs-client-provisioner
containers:
- name: nfs-client-provisioner
image: quay.io/external_storage/nfs-client-provisioner:latest
volumeMounts:
- name: nfs-client-root
mountPath: /persistentvolumes
env:
- name: PROVISIONER_NAME
value: fuseim.pri/ifs
- name: NFS_SERVER
value: 10.0.0.15
- name: NFS_PATH
value: /data
volumes:
- name: nfs-client-root
nfs:
server: 10.0.0.15
path: /data
EOF
# RBAC
cat > /root/k8s_yaml/sts/nfs-client-rbac.yaml <<EOF
apiVersion: v1
kind: ServiceAccount
metadata:
name: nfs-client-provisioner
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: nfs-client-provisioner-runner
rules:
- apiGroups: [""]
resources: ["persistentvolumes"]
verbs: ["get", "list", "watch", "create", "delete"]
- apiGroups: [""]
resources: ["persistentvolumeclaims"]
verbs: ["get", "list", "watch", "update"]
- apiGroups: ["storage.k8s.io"]
resources: ["storageclasses"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["events"]
verbs: ["list", "watch", "create", "update", "patch"]
- apiGroups: [""]
resources: ["endpoints"]
verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: run-nfs-client-provisioner
subjects:
- kind: ServiceAccount
name: nfs-client-provisioner
namespace: default
roleRef:
kind: ClusterRole
name: nfs-client-provisioner-runner
apiGroup: rbac.authorization.k8s.io
EOF
# 建立SC資源,基於nfs-client-provisioner,設為預設SC
cat > /root/k8s_yaml/sts/nfs-client-class.yaml <<EOF
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: course-nfs-storage
annotations:
storageclass.kubernetes.io/is-default-class: "true"
provisioner: fuseim.pri/ifs
EOF
給sc資源,命令列打預設補丁:
kubectl patch storageclass course-nfs-storage -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"true"}}}'
- 建立資源(準備映象:quay.io/external_storage/nfs-client-provisioner:latest)
kubectl create -f .
- 建立pvc資源yaml檔案
cat > /root/k8s_yaml/sts/test_pvc1.yaml <<EOF
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: pvc1
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Gi
EOF
- 建立pvc資源:測試動態儲存
kubectl create -f test_pvc1.yaml
- 檢視資源:驗證動態儲存
kubectl get pvc
kubectl get pv
- 檢視sts解釋
kubectl explain sts.spec.volumeClaimTemplates
kubectl explain sts.spec.volumeClaimTemplates.spec
kubectl explain sts.spec.selector.matchLabels
- 建立sts及其依賴svc資源yaml檔案
# 建立無頭service:不分配 ClusterIP
cat > /root/k8s_yaml/sts/sts_svc.yaml <<EOF
kind: Service
apiVersion: v1
metadata:
name: nginx
spec:
type: ClusterIP
clusterIP: None
ports:
- port: 80
targetPort: 80
selector:
app: nginx
EOF
cat > /root/k8s_yaml/sts/sts.yaml <<EOF
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: nginx
spec:
serviceName: nginx
replicas: 2
selector:
matchLabels:
app: nginx
volumeClaimTemplates:
- metadata:
name: html
spec:
resources:
requests:
storage: 5Gi
accessModes:
- ReadWriteOnce
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.13
volumeMounts:
- name: html
mountPath: /usr/shart/nginx/html
ports:
- containerPort: 80
EOF
- 建立svc和sts資源
kubectl create -f sts_svc.yaml
kubectl create -f sts.yaml
- 檢視資源:pod是有序的,對應pvc也是有序的,但pvc無序
kubectl get pod
kubectl get pv
kubectl get pvc
- 直接使用域名訪問容器:容器名不變,即域名不變
ping nginx-0.nginx.default.svc.cluster.local
- 檢視DNS地址
[root@k8s-adm-master sts]# kubectl get pod -n kube-system -o wide | grep coredns
coredns-bccdc95cf-9sc5f 1/1 Running 2 20h 10.244.0.6 k8s-adm-master <none> <none>
coredns-bccdc95cf-k298p 1/1 Running 2 20h 10.244.0.7 k8s-adm-master <none> <none>
- 解析域名
yum install bind-utils -y
dig @10.244.0.6 nginx-0.nginx.default.svc.cluster.local +short
nginx-0.nginx.default.svc.cluster.local
Pod 的 DNS 子域:
$(主機名).$(所屬服務的 DNS 域名)
主機名:
$(StatefulSet 名稱)-$(序號)
所屬服務的 DNS 域名:
$(服務名稱).$(名稱空間).svc.$(叢集域名)
叢集域名:
cluster.local
服務名稱由 StatefulSet 的
serviceName
域來設定。
叢集域名 服務(名字空間/名字) StatefulSet(名字空間/名字) StatefulSet 域名 Pod DNS Pod 主機名 cluster.local default/nginx default/web nginx.default.svc.cluster.local web-{0..N-1}.nginx.default.svc.cluster.local web-{0..N-1} cluster.local foo/nginx foo/web nginx.foo.svc.cluster.local web-{0..N-1}.nginx.foo.svc.cluster.local web-{0..N-1} kube.local foo/nginx foo/web nginx.foo.svc.kube.local web-{0..N-1}.nginx.foo.svc.kube.local web-{0..N-1}
Job資源
一次性任務,例如:清理es索引。
- 建立job資源yaml檔案
mkdir -p /root/k8s_yaml/job/ && cd /root/k8s_yaml/job/
cat > /root/k8s_yaml/job/job.yaml <<EOF
apiVersion: batch/v1
kind: Job
metadata:
name: nginx
spec:
template:
metadata:
name: myjob
spec:
containers:
- name: nginx
image: nginx:1.13
ports:
- containerPort: 80
command: ["sleep","10"]
restartPolicy: Never
EOF
- 建立job資源
kubectl create -f job.yaml
- 檢視資源:啟動一個pod,10秒後關閉,STATUS:Completed
kubectl get job
kubectl get pod
CronJob資源
定時任務
- 建立cronjob資源yaml檔案
cat > /root/k8s_yaml/job/cronjob.yaml <<EOF
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: nginx
spec:
schedule: "*/1 * * * *"
jobTemplate:
spec:
template:
metadata:
name: myjob
spec:
containers:
- name: nginx
image: nginx:1.13
ports:
- containerPort: 80
command: ["sleep","10"]
restartPolicy: Never
EOF
- 建立cronjob資源
kubectl create -f cronjob.yaml
- 檢視資源:10秒後建立一個pod
kubectl get cronjobs
kubectl get pod