Kubernetes02-安裝Kubernetes(使用kubeadm)


  • Kubernetes從1.4版本開始引入了命令行工具kubeadm,致力於簡化集群的安裝過程,並解決Kubernetes集群的高可用問題。
  • 在Kubernetes 1.13版本中,kubeadm工具進入GA階段,宣稱已經為生產環境應用准備就緒。

1、系統要求

1.1、部署環境

  • 軟件版本
    • Kubernetes:各組件的版本是1.20.14
    • docker:docker-ce-19.03.10
  • 系統環境
    • 10.1.1.11:CentOSLinuxrelease7.7.1908(Core)
    • 10.1.1.12:CentOSLinuxrelease7.7.1908(Core)
    • 10.1.1.13:CentOSLinuxrelease7.7.1908(Core)
  • 各個虛擬機的要求
    • 核數最少兩個
    • 內存最少2G

1.2、系統要求

  • Kubernetes系統由一組可執行程序組成,用戶可以通過GitHub上的Kubernetes項目頁下載編譯好的二進制包,或者下載源代碼並編譯后進行安裝。
  • 安裝Kubernetes對軟件和硬件的系統要求如表所示:

  • Kubernetes需要容器運行時(Container Runtime Interface,CRI)的支持,目前官方支持的容器運行時包括:Docker、Containerd、CRI-O和frakti。

1.3、安裝前的准備(所有節點)

1、配置機器主機名

#在10.1.1.11上執行如下:
hostnamectl set-hostname k8s-master1 && bash 
#在10.1.1.12上執行如下:
hostnamectl set-hostname k8s-node1 && bash
#在10.1.1.13上執行如下:
hostnamectl set-hostname k8s-node2 && bash

2、配置主機hosts文件,相互之間通過主機名互相訪問

  • 修改每台機器的/etc/hosts文件,增加如下三行:
cat >> /etc/hosts << EOF
10.1.1.11 k8s-master1
10.1.1.12 k8s-node1
10.1.1.13 k8s-node2
EOF

3、關閉交換分區swap,提升性能

  • Swap是交換分區,如果機器內存不夠,會使用swap分區,但是swap分區的性能較低,k8s設計的時候為了能提升性能,默認是不允許使用交換分區的。Kubeadm初始化的時候會檢測swap是否關閉,如果沒關閉,那就初始化失敗。如果不想要關閉交換分區,初始化k8s的時候可以指定--ignore-preflight-errors=Swap來解決。
#查看swap狀態
free -h

#關閉swap,臨時有效
swapoff -a

#注釋掉swap,重啟機器,永久有效
vim /etc/fstab
#/dev/mapper/centos-swap swap                    swap    defaults        0 0

4、修改機器內核參數

#加載br_netfilter模塊
modprobe br_netfilter
echo "modprobe br_netfilter" >> /etc/profile

#修改內核參數
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.ipv6.conf.all.disable_ipv6 = 1
EOF

#使修改的參數生效
sysctl -p /etc/sysctl.d/k8s.conf
  • 問題1:sysctl是做什么的?
    • 在運行時配置內核參數。-p從指定的文件加載系統參數,如不指定即從/etc/sysctl.conf中加載
  • 問題2:為什么要執行modprobe br_netfilter?
    • sysctl -p /etc/sysctl.d/k8s.conf出現報錯:
      • sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: No such file or directory
      • sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: No such file or directory
  • 問題3:為什么開啟net.bridge.bridge-nf-call-iptables內核參數?
    • 在centos下安裝docker,執行docker info出現如下警告:
      • WARNING: bridge-nf-call-iptables is disabled
      • WARNING: bridge-nf-call-ip6tables is disabled
  • 問題4:為什么要開啟net.ipv4.ip_forward = 1參數?
    • kubeadm初始化k8s如果報錯:
      • [ERROR FileContent--proc-sys-net-ipv4-ip_forward]: /proc/sys/net/ipv4/ip_forward contents are not set to 1
    • net.ipv4.ip_forward是數據包轉發:
      • 出於安全考慮,Linux系統默認是禁止數據包轉發的。所謂轉發即當主機擁有多於一塊的網卡時,其中一塊收到數據包,根據數據包的目的ip地址將數據包發往本機另一塊網卡,該網卡根據路由表繼續發送數據包。這通常是路由器所要實現的功能。
      • 要讓Linux系統具有路由轉發功能,需要配置一個Linux的內核參數net.ipv4.ip_forward。這個參數指定了Linux系統當前對路由轉發功能的支持情況;其值為0時表示

5、關閉firewalld防火牆

  • 需要注意的是,CentOS Linux 7默認啟動了防火牆服務(firewalld),而Kubernetes的Master與工作Node之間會有大量的網絡通信,安全的做法是在防火牆上配置各組件需要相互通信的端口號。
  • 在安全的內部網絡環境中可以關閉防火牆服務
#查看防護牆狀態
systemctl status firewalld.service

#關閉防火牆
systemctl stop firewalld.service
systemctl disable firewalld.service

6、關閉selinux

  • 禁用SELinux,讓容器可以讀取主機文件系統:
#查看selinux的狀態
getenforce 

#臨時有效
setenforce 0

#永久有效。改系統文件/etc/sysconfig/selinux,然后重啟機器
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

7、配置時間同步

#安裝ntpdate
yum install ntpdate -y
#同步時間
ntpdate ntp1.aliyun.com

8、開啟ipvs

cat > /etc/sysconfig/modules/ipvs.modules << EOF
#!/bin/bash
ipvs_modules="ip_vs ip_vs_lc ip_vs_wlc ip_vs_rr ip_vs_wrr ip_vs_lblc ip_vs_lblcr ip_vs_dh ip_vs_sh ip_vs_nq ip_vs_sed ip_vs_ftp nf_conntrack"
for kernel_module in \${ipvs_modules}; do
    /sbin/modinfo -F filename \${kernel_module} > /dev/null 2>&1
    if [ 0 -eq 0 ]; then
        /sbin/modprobe \${kernel_module}
    fi
done
EOF

chmod 755 /etc/sysconfig/modules/ipvs.modules
bash /etc/sysconfig/modules/ipvs.modules
#查看是否開啟ip_vs
lsmod | grep ip_vs
  • 問題1:ipvs是什么?
    • ipvs (IP Virtual Server) 實現了傳輸層負載均衡,也就是我們常說的4層LAN交換,作為 Linux 內核的一部分。ipvs運行在主機上,在真實服務器集群前充當負載均衡器。ipvs可以將基於TCP和UDP的服務請求轉發到真實服務器上,並使真實服務器的服務在單個 IP 地址上顯示為虛擬服務。
  • 問題2:ipvs和iptable對比分析
    • kube-proxy支持 iptables 和 ipvs 兩種模式, 在kubernetes v1.8 中引入了 ipvs 模式,在 v1.9 中處於 beta 階段,在 v1.11 中已經正式可用了。iptables 模式在 v1.1 中就添加支持了,從 v1.2 版本開始 iptables 就是 kube-proxy 默認的操作模式,ipvs 和 iptables 都是基於netfilter的,但是ipvs采用的是hash表,因此當service數量達到一定規模時,hash查表的速度優勢就會顯現出來,從而提高service的服務性能。
    • ipvs模式和iptables模式之間有哪些差異呢?
      • 1、ipvs 為大型集群提供了更好的可擴展性和性能
      • 2、ipvs 支持比 iptables 更復雜的復制均衡算法(最小負載、最少連接、加權等等)
      • 3、ipvs 支持服務器健康檢查和連接重試等功能

9、安裝基礎包(非必須)

yum install -y yum-utils device-mapper-persistent-data lvm2 wget net-tools \
    nfs-utils lrzsz gcc gcc-c++ make cmake libxml2-devel openssl-devel curl \
    curl-devel unzip sudo ntp libaio-devel wget vim ncurses-devel autoconf \
    automake zlib-devel  python-devel epel-release openssh-server socat  ipvsadm \
    conntrack ntpdate telnet ipvsadm

10、安裝iptables(非必須)

  • 如果用firewalld不習慣,可以安裝iptables
#安裝iptables
yum install iptables-services -y
#禁用iptables
service iptables stop && systemctl disable iptables
#清空防火牆規則
iptables -F

11、查看內核版本、cpu核數和內存大小

#內核至少要3.10
uname -a
#cpu核數最少要2個
cat /proc/cpuinfo | grep "processor" | wc -l
#內存大小至少要2G
free -h
#centos版本最好在7.5以上
cat /etc/redhat-release

2、配置yum源(所有節點)

1、配置docker的yum源

  • http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
  • https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -P /etc/yum.repos.d/

2、配置kubernetes的yum源

  • 官方yum源的地址
    • https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64。
  • 如果無法訪問官方yum源的地址,可以使用國內的yum源
    • http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
    • https://mirrors.tuna.tsinghua.edu.cn/kubernetes/yum/repos/kubernetes-el7-x86_64/
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name= kubernetes CentOS-7
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
EOF

3、安裝docker(所有節點)

1、安裝docker

yum install docker-ce-19.03.10 docker-ce-cli-19.03.10 containerd.io -y

2、鏡像加速和文件驅動器

  • 修改docker文件驅動為systemd,默認為cgroupfs,kubelet默認使用systemd,兩者必須一致才可以。
    • 不修改,在進行初始化master時會有警告信息([Docker SystemdCheck]: detected cgroupfs" as the Docker cgroup dr iver. The r ecommended dr fiver is" systemd")
mkdir -p /etc/docker/

cat > /etc/docker/daemon.json << EOF
{
    "registry-mirrors": [
        "https://rsbud4vc.mirror.aliyuncs.com",
        "https://registry.docker-cn.com",
        "https://docker.mirrors.ustc.edu.cn",
        "https://dockerhub.azk8s.cn",
        "http://hub-mirror.c.163.com",
        "http://qtid6917.mirror.aliyuncs.com", 
        "https://rncxm540.mirror.aliyuncs.com"],
    "exec-opts": [
        "native.cgroupdriver=systemd"]
} 
EOF

#查看配置是否生效(啟動docker后)
docker info

3、啟動docker

systemctl daemon-reload
systemctl enable docker.service
systemctl start docker.service

systemctl status docker.service
  • 修改網絡參數,將下列文件的值改為1
#要先啟動docker,才會有前兩個文件
cat /proc/sys/net/bridge/bridge-nf-call-ip6tables
cat /proc/sys/net/bridge/bridge-nf-call-iptables

cat /proc/sys/net/ipv4/ip_forward
cat /proc/sys/net/ipv6/conf/default/disable_ipv6
cat /proc/sys/net/ipv6/conf/all/disable_ipv6

#修改
echo 1 > /proc/sys/net/bridge/bridge-nf-call-ip6tables
echo 1 > /proc/sys/net/bridge/bridge-nf-call-iptables
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv6/conf/default/disable_ipv6
echo 1 > /proc/sys/net/ipv6/conf/all/disable_ipv6

4、部署master節點

4.1、安裝相關組件和拉去鏡像

1、安裝master的相關組件

#安裝應用
yum install kubeadm-1.20.14 kubelet-1.20.14 kubectl-1.20.14 -y

2、拉取master需要相關鏡像

  • 默認拉取的是k8s.gcr.io上的鏡像(國內不能訪問該網站)
#列出所需的鏡像列表
kubeadm config images list

#拉取鏡像到本地
kubeadm config images pull    #因拉取超時而失敗
  • 使用aliyun的鏡像倉庫獲取鏡像
kubeadm config images pull --kubernetes-version v1.20.14 --image-repository registry.aliyuncs.com/google_containers

4.2、初始化master節點

  • 啟動kubelet服務
systemctl enable kubelet.service    #開機自啟一定要執行
systemctl start kubelet.service

#啟動失敗,是因為還沒有初始化master節點。執行kubeadm init后,其狀態就會恢復正常
systemctl status kubelet.service
  • 初始化master節點
    • 注意:kubeadm的安裝過程不涉及網絡插件(CNI)的初始化,因此kubeadm初步安裝完成的集群不具備網絡功能,任何Pod包括自帶的CoreDNS都無法正常工作。
    • 網絡插件的安裝往往對kubeadm init命令的參數有一定的要求。例如,安裝Flannel或Calico插件時需要指定--pod-network-cidr的值。
kubeadm init --kubernetes-version=v1.20.14 --pod-network-cidr=10.10.0.0/16 \ 
    --service-cidr=10.20.0.0/16 --image-repository=registry.aliyuncs.com/google_containers
    • --kubernetes-version:指定kubernetes的版本號
    • --pod-network-cidr:Pod可以用網絡
    • --service-cidr:Service可以用的網絡
    • --image-repository:指定國內的鏡像倉庫
  • 修改/etc/kubernetes/manifests/kube-apiserver.yaml, 在 - --service-cluster-ip-range=10.20.0.0/16的下面加一行。
    • 如果不修改,將無法使用較小的端口。(需重啟kubelet服務)
vim /etc/kubernetes/manifests/kube-apiserver.yaml
    - --service-node-port-range=1-65355

4.3、初始化后的操作

  • 讓用戶可以使用kubectl
#如果是普通用戶執行以下命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

#如果是root用戶,執行下面命令
#臨時有效
export KUBECONFIG=/etc/kubernetes/admin.conf
#永久有效
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" >> /etc/profile
source /etc/profile
  • 保留最后的輸出:這是node節點加入集群的憑證,在node上用root用戶執行下面的命令就可以加入該集群。
kubeadm join 10.1.1.11:6443 --token ck4388.1w2l2356yv8zu4bk \
    --discovery-token-ca-cert-hash sha256:4af0b74e59514e0a108dceaa65ce941c971ab1ca92207b7ef8b9c9411a5161dc

4.4、查看master是否正常

1、顯示組件狀態信息

]# kubectl get cs    #或kubectl get componentstatus
Warning: v1 ComponentStatus is deprecated in v1.19+
NAME                 STATUS      MESSAGE                                                                                       ERROR
controller-manager   Unhealthy   Get "http://127.0.0.1:10252/healthz": dial tcp 127.0.0.1:10252: connect: connection refused   
scheduler            Unhealthy   Get "http://127.0.0.1:10251/healthz": dial tcp 127.0.0.1:10251: connect: connection refused   
etcd-0               Healthy     {"health":"true"}
  • 有兩個組件是不正常的(Unhealthy),解決方案如下:
#刪除下面兩個文件中的“--port=0”
sed -i '/--port=0/d' /etc/kubernetes/manifests/kube-controller-manager.yaml
sed -i '/--port=0/d' /etc/kubernetes/manifests/kube-scheduler.yaml
#重啟kubelet
systemctl restart kubelet.service

2、顯示各節點狀態信息

  • Master為NotReady狀態,是因為還沒有安裝CNI網絡插件
]# kubectl get nodes
NAME         STATUS     ROLES                  AGE     VERSION
k8s-master   NotReady   control-plane,master   3m11s   v1.20.14

3、查看集群日志

  • 此時日志肯定有報錯,先忽略
journalctl -f -u kubelet

tail -50 /var/log/messages

5、部署node節點

1、安裝kubeadm和相關工具

#安裝應用
yum install kubeadm-1.20.14 kubelet-1.20.14 kubectl-1.20.14 -y

#啟動kubelet服務
systemctl enable kubelet.service
systemctl start kubelet.service

systemctl status kubelet.service    #啟動失敗,因為還沒有加入集群。執行kubeadm join后,其狀態就會恢復正常

2、將node加入集群

#master初始化時輸出的憑證信息
kubeadm join 10.1.1.11:6443 --token ck4388.1w2l2356yv8zu4bk \
    --discovery-token-ca-cert-hash sha256:4af0b74e59514e0a108dceaa65ce941c971ab1ca92207b7ef8b9c9411a5161dc

3、顯示各節點狀態信息

  • 節點都為NotReady狀態,是因為還沒有安裝CNI網絡插件
]# kubectl get nodes
NAME          STATUS     ROLES                  AGE     VERSION
k8s-master    NotReady   control-plane,master   5m28s   v1.20.14
k8s-node1     NotReady   <none>                 2m17s   v1.20.14
k8s-node2     NotReady   <none>                 2m33s   v1.20.14

6、安裝網絡插件

  • CNI網絡插件,可以有許多選擇,請參考https://kubernetes.io/zh/docs/concepts/cluster-administration/networking/#how-to-implement-the-kubernetes-networking-model的說明。
  • 安裝Calico的方法和flannel一樣,也是要修改"--pod-network-cidr"對應的參數值。

1、安裝網絡插件flannel

  • 官網:https://github.com/flannel-io/flannel
#下載kube-flannel.yml
wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml    #該文件可能下載不了,原因出在“raw.githubusercontent.com”上

#修改kube-flannel.yml中的Network的值,要與初始化時的參數--pod-network-cidr的值一致
  net-conf.json: |
    {
      "Network": "10.10.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }
    }

#應用kube-flannel.yml
kubectl apply -f kube-flannel.yml
  • kube-flannel.yml文件
---
kind: Namespace
apiVersion: v1
metadata:
  name: kube-flannel
  labels:
    pod-security.kubernetes.io/enforce: privileged
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: flannel
rules:
- 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-flannel
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: flannel
  namespace: kube-flannel
---
kind: ConfigMap
apiVersion: v1
metadata:
  name: kube-flannel-cfg
  namespace: kube-flannel
  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-flannel
  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-plugin
       #image: flannelcni/flannel-cni-plugin:v1.1.0 for ppc64le and mips64le (dockerhub limitations may apply)
        image: docker.io/rancher/mirrored-flannelcni-flannel-cni-plugin:v1.1.0
        command:
        - cp
        args:
        - -f
        - /flannel
        - /opt/cni/bin/flannel
        volumeMounts:
        - name: cni-plugin
          mountPath: /opt/cni/bin
      - name: install-cni
       #image: flannelcni/flannel:v0.19.2 for ppc64le and mips64le (dockerhub limitations may apply)
        image: docker.io/rancher/mirrored-flannelcni-flannel:v0.19.2
        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: flannelcni/flannel:v0.19.2 for ppc64le and mips64le (dockerhub limitations may apply)
        image: docker.io/rancher/mirrored-flannelcni-flannel:v0.19.2
        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
        - name: EVENT_QUEUE_DEPTH
          value: "5000"
        volumeMounts:
        - name: run
          mountPath: /run/flannel
        - name: flannel-cfg
          mountPath: /etc/kube-flannel/
        - name: xtables-lock
          mountPath: /run/xtables.lock
      volumes:
      - name: run
        hostPath:
          path: /run/flannel
      - name: cni-plugin
        hostPath:
          path: /opt/cni/bin
      - name: cni
        hostPath:
          path: /etc/cni/net.d
      - name: flannel-cfg
        configMap:
          name: kube-flannel-cfg
      - name: xtables-lock
        hostPath:
          path: /run/xtables.lock
          type: FileOrCreate
View Code

2、等待所有pod正常啟動

  • 如果發現有狀態錯誤的Pod,則可以執行kubectl --namespace=kubesystem describe pod<pod_name>來查看錯誤原因,常見的錯誤原因是鏡像沒有下載完成。
  • 至此,通過kubeadm工具就實現了Kubernetes集群的快速搭建。如果安裝失敗,則可以執行kubeadm reset命令將主機恢復原狀,重新執行kubeadm init命令,再次進行安裝。
]# kubectl get pods -A
NAMESPACE      NAME                                  READY   STATUS    RESTARTS   AGE
kube-flannel   kube-flannel-ds-wcnr6                 1/1     Running   0          8m51s
kube-flannel   kube-flannel-ds-wggzq                 1/1     Running   0          8m51s
kube-flannel   kube-flannel-ds-xq667                 1/1     Running   0          8m51s
kube-system    coredns-7f89b7bc75-72c2x              1/1     Running   0          16m
kube-system    coredns-7f89b7bc75-f9w6h              1/1     Running   0          16m
kube-system    etcd-k8s-master1                      1/1     Running   0          16m
kube-system    kube-apiserver-k8s-master1            1/1     Running   0          15m
kube-system    kube-controller-manager-k8s-master1   1/1     Running   0          13m
kube-system    kube-proxy-56njb                      1/1     Running   0          10m
kube-system    kube-proxy-89bhn                      1/1     Running   0          10m
kube-system    kube-proxy-k7vk5                      1/1     Running   0          16m
kube-system    kube-scheduler-k8s-master1            1/1     Running   0          13m
  • 此時各節點的狀態已經正常了
]# kubectl get nodes
NAME          STATUS   ROLES                  AGE   VERSION
k8s-master    Ready    control-plane,master   14m   v1.20.14
k8s-node1     Ready    <none>                 10m   v1.20.14
k8s-node2     Ready    <none>                 10m   v1.20.14

7、驗證Kubernetes集群是否安裝完成

  • kubeadm在Master上也安裝了kubelet,在默認情況下master並不參與工作負載。如果希望master也參與工作負載,則可以執行下面的命令(刪除Master的污點 “node-role.kubernetes.io/master”),讓Master也作為一個Node
kubectl taint nodes --all node-role.kubernetes.io/master

7.1、測試網絡

  • busybox的pod的yaml文件(test-busybox.yaml)
    • 注意,busybox的鏡像使用1.28的,不是latest,否者測試coredns會出現不正常的情況
apiVersion: v1
kind: Service
metadata:
  name: test-busybox-svc
  namespace: default
  labels:
    app: test-busybox-svc
spec:
  type: NodePort
  ports:
  - port: 54321
    targetPort: 54321
    nodePort: 54321
    protocol: TCP
    name: http
  selector:
    app: test-busybox-pod
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-busybox-deployment
  namespace: default
spec:
  selector:
    matchLabels:
      app: test-busybox-pod
  replicas: 2
  template:
    metadata:
      labels:
        app: test-busybox-pod
    spec:
      imagePullSecrets:
       - name: svharborwx
      containers:
      - name: test-busybox-container
        image: busybox:1.28
        imagePullPolicy: IfNotPresent
        command: ["/bin/sleep", "10000000000"]
        ports:
        - containerPort: 54321
View Code
  • 應用test-busybox.yaml文件啟動pod
kubectl apply -f test-busybox.yaml

]# kubectl get pods -A -o wide
NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE   IP             NODE         NOMINATED NODE   READINESS GATES
default       test-busybox-deployment-5dd4f8dc7f-728tz   1/1     Running   0          35s   10.10.2.3      k8s-node01   <none>           <none>
default       test-busybox-deployment-5dd4f8dc7f-7x6nc   1/1     Running   0          35s   10.10.1.3      k8s-node02   <none>           <none>

1、測試flanel是否正常

]# kubectl exec test-busybox-deployment-5dd4f8dc7f-728tz -it -- /bin/sh
/ # ping -c 2 www.baidu.com
PING www.baidu.com (180.101.49.11): 56 data bytes
64 bytes from 180.101.49.11: seq=0 ttl=50 time=10.409 ms
64 bytes from 180.101.49.11: seq=1 ttl=50 time=7.748 ms

--- www.baidu.com ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 7.748/9.078/10.409 ms
/ # ping -c 2 10.10.1.3
PING 10.10.1.3 (10.10.1.3): 56 data bytes
64 bytes from 10.10.1.3: seq=0 ttl=62 time=0.599 ms
64 bytes from 10.10.1.3: seq=1 ttl=62 time=0.405 ms

--- 10.10.1.3 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.405/0.502/0.599 ms

2、測試coredns是否正常

  • 查看服務名稱及其IP地址
]# kubectl get svc
NAME               TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)           AGE
kubernetes         ClusterIP   10.20.0.1       <none>        443/TCP           93m
test-busybox-svc   NodePort    10.20.113.164   <none>        54321:54321/TCP   4m43s
  • 測試dns
]# kubectl exec test-busybox-deployment-5dd4f8dc7f-728tz -it -- /bin/sh
/ # nslookup kubernetes.default.svc.cluster.local
Server:    10.20.0.10
Address 1: 10.20.0.10 kube-dns.kube-system.svc.cluster.local

Name:      kubernetes.default.svc.cluster.local
Address 1: 10.20.0.1 kubernetes.default.svc.cluster.local
/ # nslookup test-busybox-svc.default.svc.cluster.local
Server:    10.20.0.10
Address 1: 10.20.0.10 kube-dns.kube-system.svc.cluster.local

Name:      test-busybox-svc.default.svc.cluster.local
Address 1: 10.20.113.164 test-busybox-svc.default.svc.cluster.local
/ # nslookup www.baidu.com
Server:    10.20.0.10
Address 1: 10.20.0.10 kube-dns.kube-system.svc.cluster.local

Name:      www.baidu.com
Address 1: 110.242.68.3
Address 2: 110.242.68.4

7.2、搭建一個應用實例

1、創建pod用的yaml文件(test-nginx.yaml)

apiVersion: v1
kind: Service
metadata:
  name: test-nginx-svc
  namespace: default
  labels:
    app: test-nginx-svc
spec:
  type: NodePort
  ports:
  - port: 8080
    targetPort: 80
    nodePort: 8080
    protocol: TCP
    name: http
  selector:
    app: test-nginx-pod
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-nginx-deployment
  namespace: default
spec:
  selector:
    matchLabels:
      app: test-nginx-pod
  replicas: 2
  template:
    metadata:
      labels:
        app: test-nginx-pod
    spec:
      imagePullSecrets:
       - name: svharborwx
      volumes:
      - name: html
        hostPath:
          path: /apps/html
      containers:
      - name: test-nginx-container
        image: nginx:latest
        imagePullPolicy: IfNotPresent
        command: ["/usr/sbin/nginx", "-g", "daemon off;"]
        ports:
        - containerPort: 80
        volumeMounts:
        - mountPath: /usr/share/nginx/html
          name: html
View Code

2、創建index.html文件

mkdir -p /apps/html
echo "<h1>11</h1>" > /apps/html/index.html

3、啟動pod

kubectl apply -f test-nginx.yaml

4、訪問

curl http://10.1.1.11:8080/index.html

1

#                                                                                                                       #


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM