- 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
- sysctl -p /etc/sysctl.d/k8s.conf出現報錯:
- 問題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
- 在centos下安裝docker,執行docker info出現如下警告:
- 問題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時表示
- kubeadm初始化k8s如果報錯:
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
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
- 應用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
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
# #