K8S Kubeadm案例實戰(zhàn)
Kubeadm 是一個K8S部署工具,它提供了kubeadm init 以及 kubeadm join 這兩個命令來快速創(chuàng)建kubernetes集群。
Kubeadm 通過執(zhí)行必要的操作來啟動和運行一個最小可用的集群。它故意被設計為只關心啟動集群,而不是之前的節(jié)點準備工作。同樣的諸如安裝各種各樣值得擁有的插件,例如Kubernetes Dashboard、監(jiān)控解決方案以及特定云提供商的插件,這些都不在它負責的范圍。
相反我們期望由一個基于 kubeadm 從更高層設計的更加合適的工具來做這些事情;并且,理想情況下,使用 kubeadm 作為所有部署的基礎將會使得創(chuàng)建一個符合期望的集群變得容易。
Kubeadm:用于初始化K8S Cluster的工具,會用到Kubelet組件服務,運行在Cluster所有節(jié)點上,負責調用Docker指令,啟動POD和容器。kubectl:kubectl是kubenetes命令行工具,通過Kubectl可以部署和管理應用,查看各種資源,創(chuàng)建,刪除和更新組件。
在機器上手動安裝 docker、kubeadm、kubelet、kubectl 幾個二進制文件,然后才能再容器化部署其他 Kubernetes 組件。主要通過kubeadm init初始化,初始化K8S集群的流程如下:
- 檢查工作(Preflight Checks):檢查Linux內核版本、Cgroups模塊可用性、組件版本、端口占用情況、Docker等依賴情況;
- 生成對外提供服務的CA證書及對應的目錄;
- 生成其他組件訪問 kube-apiserver 所需的配置文件;
- 為Master組件生成應用容器的配置文件,利用這些配置文件,通過Kubernetes 中特殊的容器啟動方法:“Static Pod”(Kubeadm init-Kubelet啟動時自動加載固定目錄的 Pod YAML 文件并啟動)-Docker引擎-啟動kube-apiserver、kube-controller-manager、kube-scheduler 三個 Master 組件。同時還會生成 Etcd 的 Pod YAML 文件;
- 為集群生成一個Bootstrap token,其他節(jié)點加入集群的機器和 Apiserver打交道,需要獲取相應的證書文件,所以Bootstrap token需要扮演安全驗證的角色;
- 安裝默認插件,例如:Kube-proxy 和Core DNS,分別提供集群的服務發(fā)現(xiàn)和 DNS 功能。
1)安裝Kubeadm工具
#安裝Kubeadm;
yum install -y kubeadm-1.20.4 kubelet-1.20.4 kubectl-1.20.4
#啟動kubelet服務
systemctl enable kubelet.service
systemctl start kubelet.service
2)Kubeadm常見指令操作;
kubeadm init 啟動一個 Kubernetes 主節(jié)點
kubeadm join 啟動一個 Kubernetes 工作節(jié)點并且將其加入到集群
kubeadm upgrade 更新一個 Kubernetes 集群到新版本
kubeadm config 如果使用 v1.7.x 或者更低版本的 kubeadm 初始化集群,您需要對集群做一些配置以便使用 kubeadm upgrade 命令
kubeadm token 管理 kubeadm join 使用的令牌
kubeadm reset 還原 kubeadm init 或者 kubeadm join 對主機所做的任何更改
kubeadm version 打印 kubeadm 版本
kubeadm alpha 預覽一組可用的新功能以便從社區(qū)搜集反饋
K8S Master節(jié)點實戰(zhàn)
1)執(zhí)行kubeadm init初始化安裝Master相關軟件;
kubeadm init --control-plane-endpoint=192.168.1.146:6443 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.20.4 --service-cidr=10.10.0.0/16 --pod-network-cidr=10.244.0.0/16 --upload-certs
2)根據(jù)如上指令操作,執(zhí)行成功,如圖所示:
3)根據(jù)如上圖提示,接下來需手工執(zhí)行如下指令,拷貝admin配置文件;
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
4)將node節(jié)點加入K8S集群,在Node節(jié)點使用的參數(shù)和指令如下;
kubeadm join 192.168.1.146:6443 --token ze0zfe.9zhew67l6gxsq7du \
--discovery-token-ca-cert-hash sha256:ee5a3f9accf98c76a3a3da1f3c4540c14c9e9ce49a4070de4b832aa8cb3a8f31
Node1節(jié)點加入集群
#啟動Node1節(jié)點上docker引擎服務;
systemctl start docker.service
#將Node1節(jié)點加入K8S集群;
kubeadm join 192.168.1.146:6443 --token ze0zfe.9zhew67l6gxsq7du \
--discovery-token-ca-cert-hash sha256:ee5a3f9accf98c76a3a3da1f3c4540c14c9e9ce49a4070de4b832aa8cb3a8f31
#執(zhí)行kubeadm init時沒有記錄下加入集群的指令,可以通過以下命令重新創(chuàng)建即可;
kubeadm token create --print-join-command
#登錄K8S Master節(jié)點驗證節(jié)點信息;
kubectl get nodes
K8S節(jié)點網(wǎng)絡配置
Kubernetes整個集群所有服務器(Master、Minions)配置Flanneld,操作方法和指令如下:
參考:https://github.com/containernetworking/cni
必須安裝pod網(wǎng)絡插件,以便pod之間可以相互通信,必須在任何應用程序之前部署網(wǎng)絡,CoreDNS不會在安裝網(wǎng)絡插件之前啟動。
1)安裝Flanneld網(wǎng)絡插件;
Fanneld定義POD的網(wǎng)段為: 10.244.0.0/16,POD容器的IP地址會自動分配10.244開頭的網(wǎng)段IP。安裝Flanneld網(wǎng)絡插件指令如下:
#下載Fanneld插件YML文件;
yum install wget -y
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
#提前下載Flanneld組建所需鏡像;
for i in $(cat kube-flannel.yml |grep image|awk -F: '{print $2":"$3}'|uniq );do docker pull $i ;done
#應用YML文件;
kubectl apply -f kube-flannel.yml
#查看Flanneld網(wǎng)絡組建是否部署成功;
kubectl -n kube-system get pods|grep -aiE flannel
Kube-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', 'NET_RAW']
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/v1
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/v1
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
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: kubernetes.io/os
operator: In
values:
- linux
hostNetwork: true
priorityClassName: system-node-critical
tolerations:
- operator: Exists
effect: NoSchedule
serviceAccountName: flannel
initContainers:
- name: install-cni
image: quay.io/coreos/flannel:v0.13.1-rc2
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.13.1-rc2
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
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
2)安裝Calico網(wǎng)絡插件;
官方文檔參考:
https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-cluster-kubeadm/#pod-network
https://docs.projectcalico.org/v3.10/getting-started/kubernetes/
為使calico正常工作,你需要傳遞–pod-network-cidr=10.10.0.0/16到kubeadm init或更新calico.yml文件,以與您的pod網(wǎng)絡相匹配。
kubectl apply -f https://docs.projectcalico.org/v3.10/manifests/calico.yaml
如果安裝flannel網(wǎng)絡插件,必須通過kubeadm init配置–pod-network-cidr=10.10.0.0/16參數(shù)。
驗證網(wǎng)絡插件
安裝了pod網(wǎng)絡后,確認coredns以及其他pod全部運行正常,查看master節(jié)點狀態(tài)為Ready
kubectl get nodes
kubectl -n kube-system get pods文章來源:http://www.zghlxwxcb.cn/news/detail-719706.html
至此,Kubernetes 的 Master 節(jié)點就部署完成了。如果只需要一個單節(jié)點的 Kubernetes,現(xiàn)在你就可以使用了。文章來源地址http://www.zghlxwxcb.cn/news/detail-719706.html
到了這里,關于K8S云計算系列-(3)的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!