目錄
開始部署
查看部署狀態
安裝網絡插件
測試
排錯工具
友情鏈接
參考資料:
前言
這篇文章是比較久之前寫的了,無聊翻了下博客發現好幾篇博文排版莫名其妙的變了... 於是修改並完善了下。當初剛玩k8s的時候真的是踩坑踩到怕,官方的指引很多不能直接使用,然后百度上找到的很多資料都是直接搬運官網ε=(´ο`*)))唉。 最后還是硬着頭皮百度谷歌了很久才算入了門。在這里寫下這篇文章幫助下其他孩紙。
准備
在擼起袖子開干之前最好是對k8s有點基本的認識,比如什么是kubelet,啥是kubectl,配置文件又是什么東東之類的基礎。可以翻看我其它有關k8s的文章簡單了解下,雖然寫得不好,但也不會很辣眼睛。有能力的還是到谷歌和官網看看(看英文版)。
環境、工具
阿里雲學生機ECS、Ubuntu、docker、kubectl1.15.4、kubelet1.15.4、kubeadm1.15.4、
kubeadm、kubectl、kubelet簡介
kubeadm
用於部署k8s的工具很多,kubeadm就是其中之一,因為比較簡單、好上手所以用的比較多,這是一個命令行的工具,可以通過一條簡單的命令就把k8s部署好。
kubectl
kubectl也是一個命令行工具,用來管理集群。在用kubeadm工具部署好集群環境后,幾乎所有的操作都是通過kubectl來完成的。啥操作?那多了去咯,譬如在k8s中運行一個應用、部署應用服務、查看集群環境等等。最基本的一條命令就是
kubectl create
這條命令用於創建資源,什么是資源?k8s集群中所有東西都可以看做是資源,如用戶憑證,用戶角色以及用於 ”存放“ 容器的pod等。
kubectl create -f xxx.yaml
如上命令就是用配置文件創建資源的例子。”-f“ 用來指定配置文件,”xxx.yaml“就是配置文件,配置文件可以是yaml格式也可以是json,不過yaml用的比較多。配置文件基本上就是對資源屬性的描述,並不難。
配置文件可以是本地文件也可以是網絡上的文件,k8s官網的很多配置文件都是直接引用”raw.githubusercontent.com“的內容。當然,不用配置文件,直接使用命令行也是可以創建一些簡單資源的:
kubectl create serviceaccount admin-user -n kubernetes-dashboard
這就創建了一個serviceaccount資源。
kubelet
kubelet是一個自動管理、調度集群資源的程序,不需要像kuectl一樣手動去操縱它從而完成某些需求,只要懂得如何進行配置,如何查看日志即可。kubelet的配置項非常非常多,但是作為新手不用太過於關注,簡單了解即可。
安裝kubeadm、kubectl、kubelet
配置軟件源
默認apt軟件源里沒有這幾個軟件,需要添加谷歌官方的軟件源。但是因為官方提供的源無法訪問,所以這里改成阿里的源:
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt-get update
命令說明:
1.通過下載工具下載位於https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg
的deb軟件包密鑰,然后通過"apt-key"命令添加密鑰
2.通過cat把源deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
寫入到"/etc/apt/sources.list.d/kubernetes.list"
*此處下載工具使用curl,若未安裝,先執行如下命令安裝。"apt-transport-https"工具允許apt通過https來下載軟件,可以不用安裝這個,只裝curl
apt-get update && apt-get install -y apt-transport-https curl
完成以上步驟,可通過"apt-key list"命令看到類似如下的密鑰信息:
查看"/etc/apt/sources.list.d/kubernetes.list",如下:
選擇軟件版本
kubeadm、kubectl、kubelet三者的版本要一致,否則可能會部署失敗,小版本號不同倒也不會出什么問題,不過盡量安裝一致的版本。記住kubelet的版本不可以超過API server的版本。例如1.8.0的API server可以適配 1.7.0的kubelet,反之就不行了。
可以通過"apt-cache madison"命令來查看可供安裝的軟件的版本號
例:
apt-cache madison kubeadm kubelet kubectl
開始安裝
這里安裝的版本是"1.15.4-00",別忘了后面的"-00"。
需要注意,安裝kubeadm的時候,會自動安裝kubectl、kubelet和cri-tool,安裝kubelet時則會自動安裝kubernetes-cni,如下:
然而這並不是一件好事,仔細看會發現自動安裝的kubectl和kubelet是最新版本的,與kubeadm版本不一致。。。
所以應該更改安裝順序,先安裝kubectl和kubelet,命令如下:
apt-get install kubectl=1.15.4-00 kubelet=1.15.4-00 kubeadm=1.15.4-00
如果不想讓軟件更新,可以輸入:
apt-mark hold kubeadm kubectl kubelet
允許更新:
apt-mark unhold kubeadm kubectl kubelet
部署前准備
關閉防火牆
阿里雲ECS的ufw默認是"inactive",即處於關閉狀態,這步可以跳過
在ubuntu下,可以使用"ufw"管理防火牆。
查看防火牆狀態:
ufw status
禁用防火牆:
ufw diable
啟用防火牆:
ufw enable
關閉selinux(可跳過)
阿里雲ecs沒有selinux,這步跳過。如果是其它服務器提供商,如下是網上找到的方法,在此不作驗證:
- 修改/etc/selinux/config文件中設置SELINUX=disabled,然后重啟服務器
- 使用setenforce
- setenforce 1 設為enforcing模式
- setenforce 0 設為permissive模式
關閉swap
kubelet1.8+要求把swap關閉,詳細原因可以訪問Kubernetes 設計分析: 為什么 kubelet 運行時不能打開 swap?
如果你非要開啟swap的話,可以配置"--fail-swap-on flag"參數。
-
臨時修改,重啟復原
- 關閉
swapoff -a
- 開啟
swapon -a
-
永久修改,重啟生效
- 把根目錄文件系統設為可讀寫
sudo mount -n -o remount,rw /
- 修改"/etc/fstab"文件,在"/swapfile"一行前加#禁用並保存退出重啟服務器
配置並開啟kubelet服務(可跳過)
貌似安裝kubelet的時候會自動配置好。這步可以跳過。
kubelet --network-plugin=cni
systemctl enable kubelet
修改Docker的cgroup-driver
docker的cgroup-driver應該與kubelet的一致,kubelet默認為“systemd”。
方法一,修改docker的cgroup-driver為systemd
編輯"/etc/docker/daemon.json"(如果沒有這個文件就自己新建一個)
添加如下信息:
"exec-opts": ["native.cgroupdriver=systemd"]
注意,如果之前添加了其它的鏡像源,或者添加了其它參數,需要在其它配置項后用“,”逗號隔開,再添加新的配置項,否則配置文件會解析失敗。
修改完后保存,重新載入配置文件,重啟docker
systemctl daemon-reload
systemctl restart docker
方法二,修改kubelet的cgroup-driver為cgroupfs
修改"/etc/systemd/system/kubelet.service.d/10-kubeadm.conf"文件(該文件在安裝kubelet時生成),在"Environment="KUBELET_KUBECONFIG_ARGS="后增加--cgroup-driver=cgroupfs
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --cgroup-driver=cgroupfs"
配置iptable轉發規則
docker 1.13+ 版本,啟動后默認把iptable的FORWARD策略改為DROP,可能會影響k8s集群報文轉發功能,需要修改FORWARD鏈的默認策略為ACCEPT。
- 查看iptables策略
iptables -vnL
- 臨時修改
iptables -P FORWARD ACCEPT
- 永久修改
修改docker的service文件,文件路徑"/lib/systemd/system/docker.service",添加
ExecStartPost=/sbin/iptables -P FORWARD ACCEPT # 當docker啟動后會額外執行此條命令。此行加到ExecStart行下面。
重啟docker
systemctl daemon-reload
systemctl start docker
systemctl enable docker
開始部署
kubeadm init --kubernetes-version=v1.15.4 --ignore-preflight-errors=NumCPU --pod-network-cidr=10.244.0.0/16 --image-repository registry.aliyuncs.com/google_containers
參數說明:
-
"kubernetes-version":指定k8s的版本,對於不同版本k8s,kubeadm會去拉取不同版本的鏡像。
-
"--pod-network-cidr": 指定使用"cidr"方式給pod分配IP,參數的數值必須跟接下來要安裝的網絡插件flannel的配置一致, 否則flannel部署失敗。后面用到的網絡插件為flannel,flannel配置文件中默認的數值是“10.244.0.0/16”。
-
"--image-repository": 指定鏡像倉庫,kubeadm默認的倉庫地址沒法訪問,需要指定為阿里雲的地址——"registry.aliyuncs.com/google_containers"
-
"--ignore-preflight-errors":kubeadm在初始化之前,會執行“preflight”(預檢),當條件不滿足時會報錯並停止初始化進程,但是有些報錯並不會影響集群的初始化,因此可以指定該參數忽略特定的錯誤。阿里雲學生機cpu只有單核,而k8s要求雙核及以上,所以需要指定參數"--ignore-preflight-errors=NumCPU"。
該參數的用法如下:
--ignore-preflight-errors=<option>
<option>就是錯誤的類型,如上圖所示,錯誤提示是"[ERROR NumCPU]",那么參數就寫成:
--ignore-preflight-errors=NumCPU
查看部署狀態
當看到上述信息就表示集群Master節點初始化成功,在同一網絡下的機器上同樣地安裝kuneadm、kubelet並配置好環境之后,即可通過"kubeadm join"命令連接到Master節點使集群成為多節點集群:
kubeadm join 192.168.1.73:6443 --token gkp9ws.rv2guafeusg7k746 \
--discovery-token-ca-cert-hash sha256:4578b17cd7198a66438b3d49bfb878093073df23cf6c5c7ac56b3e05d2e7aec0
該token默認有效期為24小時,可通過"kubeadm token create --print-join-command"命令創建新token,並打印連接命令:
初始化成功后,在master節點上可以通過kubectl命令來查看集群上資源的狀態,但是kubectl在訪問API Server時需要認證,否則會出現"The connection to the server localhost:8080 was refused"這樣的錯誤。有如下兩種解決方法:
一、
認證信息在"/etc/kubernetes/admin.conf"文件里,所以需要把文件拷貝到"$HOME/.kube/config/"下,
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
這段命令會在初始化成功后打印出來,直接拷貝即可。
二、
也可以直接添加環境變量指定文件地址:
export KUBECONFIG=/etc/kubernetes/admin.conf
可以把這條變量添加到"/etc/profile",然后"source /etc/profile"。
配置好后,通過"kubectl get node"即可看到集群的所有節點狀態:
可以看到當前節點處於"NotReady"狀態,通過"kubectl describe node <your_node>"命令查看node情況,<your_node>替換成自己的節點名,此時可以看到這樣的信息:
在"Ready"一行,"status"為"false","message"提示"Runtime newtwork not ready",意思是網絡插件未准備好,所以此時應該給集群安裝網絡插件。
安裝網絡插件
網絡插件有很多種,此處選擇"flannel",flannel的安裝比較簡單,直接指定配置文件,用"kubectl"安裝即可。配置文件如下:
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']
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/v1beta1
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/v1beta1
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-amd64
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: beta.kubernetes.io/os
operator: In
values:
- linux
- key: beta.kubernetes.io/arch
operator: In
values:
- amd64
hostNetwork: true
tolerations:
- operator: Exists
effect: NoSchedule
serviceAccountName: flannel
initContainers:
- name: install-cni
image: quay.io/coreos/flannel:v0.11.0-amd64
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.11.0-amd64
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"]
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
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: kube-flannel-ds-arm64
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: beta.kubernetes.io/os
operator: In
values:
- linux
- key: beta.kubernetes.io/arch
operator: In
values:
- arm64
hostNetwork: true
tolerations:
- operator: Exists
effect: NoSchedule
serviceAccountName: flannel
initContainers:
- name: install-cni
image: quay.io/coreos/flannel:v0.11.0-arm64
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.11.0-arm64
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"]
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
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: kube-flannel-ds-arm
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: beta.kubernetes.io/os
operator: In
values:
- linux
- key: beta.kubernetes.io/arch
operator: In
values:
- arm
hostNetwork: true
tolerations:
- operator: Exists
effect: NoSchedule
serviceAccountName: flannel
initContainers:
- name: install-cni
image: quay.io/coreos/flannel:v0.11.0-arm
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.11.0-arm
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"]
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
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: kube-flannel-ds-ppc64le
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: beta.kubernetes.io/os
operator: In
values:
- linux
- key: beta.kubernetes.io/arch
operator: In
values:
- ppc64le
hostNetwork: true
tolerations:
- operator: Exists
effect: NoSchedule
serviceAccountName: flannel
initContainers:
- name: install-cni
image: quay.io/coreos/flannel:v0.11.0-ppc64le
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.11.0-ppc64le
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"]
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
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: kube-flannel-ds-s390x
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: beta.kubernetes.io/os
operator: In
values:
- linux
- key: beta.kubernetes.io/arch
operator: In
values:
- s390x
hostNetwork: true
tolerations:
- operator: Exists
effect: NoSchedule
serviceAccountName: flannel
initContainers:
- name: install-cni
image: quay.io/coreos/flannel:v0.11.0-s390x
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.11.0-s390x
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"]
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
博客園markdown的details標簽不好用,格式可能有點問題,給個github的傳送門
128行的network數值應與"kubeadm"初始化時指定的"--pod-network-cidr"一致,該值表示給pod分配ip時的ip前綴。
創建好配置文件后,通過"kubeclt"安裝flannel:
kubectl create -f <flannel_yaml_path>
把<flannel_yaml_path>替換成自己的配置文件路徑,執行命令后稍等片刻,單節點k8s集群就部署好了。
測試
處理taint
默認情況下,出於安全考慮,master節點會被打上一個叫"NoSchedule"的Taint(污點),可以通過"kubectl describe"看到:
這個taint使得master節點不能被調度,也就是說master節點不能部署應用,由於現在搭建的是單節點集群,當前節點既充當master又得充當worker,所以需要把這個taint去掉:
kubectl taint node <node_name> <taint>-
<node_name>替換成自己節點名稱,<taint>替換成taint,如:
kubectl taint node yo node-role.kubernetes.io/master:NoSchedule-
注意別忘了taint后面的橫杠"-","-"表示“減號”,即把taint去掉。如果想把"taint"加回去,只需要把"-"去掉,並在":"前加上"=",如"kubectl taint node yo node-role.kubernetes.io/master=:NoSchedule"
運行nginx:
docker pull nginx
kubectl run nginx --image=nginx
稍等片刻nginx就部署好了,可以通過"kubectl get pods --all-namespaces"查看,或者直接訪問"curl localhost:80"。
排錯工具
kubectl
kubectl get <resource_type>
"kubectl get"可以列出集群環境中的某類資源,對於k8s,幾乎所有內容都是“資源”,如Node、Pod、Service等,只要把"<resource_type>"替換成想查看的資源類型即可。
如查看節點資源:
kubectl get node
對於pod等其它的資源,kubectl的用法會有些許不同。k8s使用"namespace"來對集群中的資源進行分組管理,可以把"namespace"當做“分組的名稱”,也可以把"namespace"當做k8s集群中的"集群",不同"namespace"的資源在邏輯上彼此隔離,以此提高安全性,提高管理效率。用kubeectl查看這些個資源時,需要用"-n"來指定"namespace",如:
kubectl get pod -n kube-system
還可以用"--all-namespaces"來查看所有"namespaces"下的資源:
kubectl get pod --all-namespaces
kubectl describe <resource_type> <resource_name>
對於處於異常狀態的資源,可以使用該命令查看其詳細信息,只要把<resource_type>替換成資源類別,把<resource_name>替換成資源名稱即可,當然也還需要用"-n"指明"namespaces"。
如:
kubectl describe pod -n kubernetes-dashboard kubernetes-dashboard-6b855d4584-9sgsk
然后就可以看到該pod的事件信息:
docker ps -a
該命令可以查看當前所有docker容器,"-a"表示所有容器,當不加該參數時,顯示的則是正在運行的容器。由於要查看的是k8s相關的容器,以此可以使用管道命令和"grep"對顯示結果進行篩選:
docker ps -a | grep kube
對於處於"Exited"狀態的異常容器,使用"docker logs <container_id>"命令查看容器日志。如:
docker logs 37443d902aee
此處"37443d902aee"是我機器上"kubernetes-dashboard"的容器id。
友情鏈接
Tips
如果看到文章有錯誤勞煩指正謝謝Thanks♪(・ω・)ノ,如果有其它問題可以評論區留言。