1. 程式人生 > 實用技巧 >kubernetes之3---kubeadm部署k8s叢集

kubernetes之3---kubeadm部署k8s叢集

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

    firewalldNetworkManagerpostfix(非必須)

  • 修改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叢集

  1. 選擇一個控制節點(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
  1. 等待映象下載,可以使用docker images檢視下載進度。
  2. Your Kubernetes control-plane has initialized successfully!
  3. 執行提示命令1:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
  1. 執行提示命令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
  1. kubectl命令列TAB鍵補全:
echo "source <(kubectl completion bash)" >> ~/.bashrc

master節點配置flannel網路

  1. 準備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
  1. 建立資源
kubectl create -f kube-flannel.yml
  1. 檢視資源
kubectl get all -n kube-system
kubectl get nodes

metric-server

metrics-server Github 1.15

  1. 準備yaml檔案,使用國內映象地址(2個),修改一些其他引數

  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 .
  1. 檢視資源監控
kubectl top nodes

匯出所有映象

docker save `docker images|awk 'NR>1{print $1":"$2}'|xargs -n 50` -o docker_k8s_kubeadm.tar.gz

彈性伸縮

  1. 建立業務資源
kubectl create -f /root/k8s_yaml/deploy/k8s_deploy2.yaml
  1. 建立HPA規則
kubectl autoscale deploy nginx --max=6 --min=1 --cpu-percent=5
  1. 檢視pod
kubectl get pod
  1. 建立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) 使用滾動更新,可能進入損壞狀態,需要手工修復。

  1. 搭建NFS提供靜態儲存
  2. 配置動態儲存
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"}}}'
  1. 建立資源(準備映象:quay.io/external_storage/nfs-client-provisioner:latest)
kubectl create -f .
  1. 建立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
  1. 建立pvc資源:測試動態儲存
kubectl create -f test_pvc1.yaml
  1. 檢視資源:驗證動態儲存
kubectl get pvc
kubectl get pv
  1. 檢視sts解釋
kubectl explain sts.spec.volumeClaimTemplates
kubectl explain sts.spec.volumeClaimTemplates.spec
kubectl explain sts.spec.selector.matchLabels
  1. 建立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
  1. 建立svc和sts資源
kubectl create -f sts_svc.yaml
kubectl create -f sts.yaml
  1. 檢視資源:pod是有序的,對應pvc也是有序的,但pvc無序
kubectl get pod
kubectl get pv
kubectl get pvc
  1. 直接使用域名訪問容器:容器名不變,即域名不變
ping nginx-0.nginx.default.svc.cluster.local
  1. 檢視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>
  1. 解析域名
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索引。


  1. 建立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
  1. 建立job資源
kubectl create -f job.yaml
  1. 檢視資源:啟動一個pod,10秒後關閉,STATUS:Completed
kubectl get job
kubectl get pod

CronJob資源

定時任務


  1. 建立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
  1. 建立cronjob資源
kubectl create -f cronjob.yaml
  1. 檢視資源:10秒後建立一個pod
kubectl get cronjobs
kubectl get pod