? ? ?本篇博文是 centos 7 系統(tǒng)安裝 kubernetes 單機(jī) master 節(jié)點(diǎn)操作。
一: 查看 服務(wù)器 配置信息
? ? ? 1. 執(zhí)行命令查看服務(wù)器cpu信息。安裝 kubernetes 服務(wù),cpu核心數(shù)必須大于2,內(nèi)存大于2G。
lscpu
? ? ? 2.? 修改服務(wù)器設(shè)置信息,避免安裝出現(xiàn)問題。
? ? ? ? a.? 臨時關(guān)閉swap,防止 執(zhí)行 kubeadm 命令爆錯。
swapoff -a
? ? ? ?b. 臨時關(guān)閉 selinux,減少不必要的配置。
setenforce 0
? ? ? c. 關(guān)閉防火墻?
systemctl stop firewalld
systemctl disable firewalld
? ? ? d. 設(shè)置網(wǎng)橋信息
cat << EOF > /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_forward = 1 EOF
? ? ?e. 修改 主機(jī)名為 master?
hostnamectl set-hostname master
? ? ? f. 修改 hosts 文件,設(shè)置 master 主機(jī)名稱和本機(jī)IP 映射關(guān)系
10.0.0.206 master
?文章來源地址http://www.zghlxwxcb.cn/news/detail-825238.html
二: 安裝并配置 docker
? ?1. 安裝必須工具
yum install -y yum-utils device-mapper-persistent-data lvm2
? 2. 添加 阿里云 yum 倉庫 repo
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
? 3. 安裝 docker?
yum -y install docker-ce
? 4. 修改 docker 的? ?/etc/docker/daemon.json 文件。如果文件不存在,則創(chuàng)建新的。
? ? ? a. 設(shè)置 阿里云國內(nèi) docker 源
? ? ? b.? 設(shè)置 cgroupdriver 為 systemd
sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://xcjha0pw.mirror.aliyuncs.com"], "exec-opts": ["native.cgroupdriver=systemd"] } EOF
? ?5. 修改完后,使用新配置 重啟 docker 服務(wù)。
sudo systemctl daemon-reload
sudo systemctl restart docker
? ?6. 設(shè)置 docker 服務(wù)開機(jī)自啟動
systemctl enable docker
? ?7. 生成 containerd 配置信息,并修改 兩處相關(guān)配置。
? ? ? # 生成 containerd 的默認(rèn)配置文件
? ? ? containerd config default > /etc/containerd/config.toml
? ? ?a. 修改1 修改 sandbox_image 鏡像配置,改為阿里鏡像。
? ? ? ? ? ?# 查看 sandbox 的默認(rèn)鏡像倉庫在文件中的第幾行
? ? ? ? ? ?cat /etc/containerd/config.toml | grep -n "sandbox_image"
? ? ? ? ? # 使用 vim 編輯器 定位到 sandbox_image,將 倉庫地址修改成 阿里鏡像
? ? ? ? ? ? vim /etc/containerd/config.toml
? ? ? ? ? ? sandbox_image = " registry.aliyuncs.com/google_containers/pause:3.6"
? ? ? ?b. 修改2? 注釋掉 cri 插件,否則?kubelet 無法啟動。
sed -i -r '/cri/s/(.*)/#\1/' /etc/containerd/config.toml systemctl restart containerd
? ? ? # 重啟 containerd 服務(wù)
? ? systemctl daemon-reload
? ? systemctl restart containerd
?
?
三:kubernetes 安裝操作步驟
? ? ? 1. 配置 kubernetes 下載源。使用國內(nèi)阿里云 yum源
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
? ? ?2. 安裝 kubernetes 服務(wù)的相關(guān)應(yīng)用 kubectl, kubeadm, kubectl?
? ? ? ?kubelet:? 運(yùn)行在 cluster, 負(fù)責(zé)啟動 pod,并管理容器。
? ? ? ?kubeadm:? kubernetes 快速構(gòu)建工具,用于初始化 cluster。
? ? ? ?kubectl: kubernetes 命令工具。進(jìn)行服務(wù)的部署和管理。
yum install -y --nogpgcheck kubelet-1.28.2 kubeadm-1.28.2 kubectl-1.28.2?
? ? ?3. 查看安裝結(jié)果
kubelet --version
kubectl version
kubeadm version
? ? 4. 啟動?kubelet 服務(wù)
systemctl daemon-reload
systemctl start kubelet
systemctl enable kubelet
? ? 5.? 生成 kubernetes? 初始化配置文件 init-config.yaml, 并根據(jù)實(shí)際情況修改 3 處
apiVersion: kubeadm.k8s.io/v1beta3 bootstrapTokens: - groups: - system:bootstrappers:kubeadm:default-node-token token: abcdef.0123456789abcdef ttl: 24h0m0s usages: - signing - authentication kind: InitConfiguration localAPIEndpoint: advertiseAddress: 10.0.0.206 //修改1 master節(jié)點(diǎn)IP地址 可cat /etc/hosts 看到 bindPort: 6443 nodeRegistration: criSocket: /var/run/dockershim.sock imagePullPolicy: IfNotPresent name: master //修改2 master節(jié)點(diǎn)node的名稱 taints: null --- apiServer: timeoutForControlPlane: 4m0s apiVersion: kubeadm.k8s.io/v1beta3 certificatesDir: /etc/kubernetes/pki clusterName: kubernetes controllerManager: {} dns: {} etcd: local: dataDir: /var/lib/etcd imageRepository: registry.aliyuncs.com/google_containers //修改3 修改為阿里云地址 kind: ClusterConfiguration
kubernetesVersion: 1.28.0 networking: dnsDomain: cluster.local serviceSubnet: 10.96.0.0/12 scheduler: {}
? ?6.? 下載 kubernetes 相關(guān)鏡像
? ?注意執(zhí)行目錄在? init-config.yaml 文件目錄
kubeadm config images pull --config=init-config.yaml
? 當(dāng)鏡像拉取失敗,通過命令獲取所有需要的鏡像,然后一個個拉取
kubeadm config images list --config init-config.yaml
結(jié)果如下(不同版本有差別):
registry.aliyuncs.com/google_containers/kube-apiserver:v1.28.0
registry.aliyuncs.com/google_containers/kube-controller-manager:v1.28.0
registry.aliyuncs.com/google_containers/kube-scheduler:v1.28.0
registry.aliyuncs.com/google_containers/kube-proxy:v1.28.0
registry.aliyuncs.com/google_containers/pause:3.9
registry.aliyuncs.com/google_containers/etcd:3.5.9-0
registry.aliyuncs.com/google_containers/coredns:v1.10.1
? ?7.? 運(yùn)行 kubeadm 初始化操作,進(jìn)行master 節(jié)點(diǎn)安裝
kubeadm init --apiserver-advertise-address=10.0.0.206 --apiserver-bind-port=6443 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --kubernetes-version=1.28.2 --image-repository registry.aliyuncs.com/google_containers
? ?8.? 如果安裝失敗,重置集群初始化,然后再執(zhí)行 7 步驟。
kubeadm reset
? ?9.? 在 master 節(jié)點(diǎn)服務(wù)執(zhí)行如下命令,進(jìn)行 管理員信息配置,方便獲取 token 信息。
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
? ? 當(dāng)重置集群后,需同步刪除 $HOME/.kube 目錄
rm -rf $HOME/.kube
? ? ?10. 當(dāng)需要在 master 節(jié)點(diǎn)上布署服務(wù)時(啟動pod),則需要修改master 節(jié)點(diǎn)污點(diǎn)配置
? ? ?查看污點(diǎn)信息:
? ? ?kubectl describe node master |grep Taints
? ? ?結(jié)果:??Taints:? ? ? ? ? ? ?node-role.kubernetes.io/control-plane:NoSchedule
? ? ? 去除污點(diǎn)NoSchedule,最后一個"-"代表刪除
? ? ? ?kubectl taint nodes master node-role.kubernetes.io/control-plane:NoSchedule-
? ? ? 備注:
? ? ? ? ?NoSchedule : 一定不被調(diào)度 但是不會驅(qū)逐已有的 這個部署 ingress-controller 的時候 有用
? ? ? ? ?PreferNoSchedule : 盡量不被調(diào)度
? ? ? ? ?NoExecute : 不會調(diào)度,并且還會驅(qū)逐Node已有Pod 這個很壞
? ? ? 11.? 修改 kubernetes 布署服務(wù)時,使用的端口范圍。如果不需要調(diào)整,可以不用修改。
? ? ? ? ? ? ? ? ? k8s的node節(jié)點(diǎn)的端口默認(rèn)被限制在30000-32767的范圍
? ? ? ? ? 編輯 kube-apiserver.yaml文件
? ? ? ? ? ?vi /etc/kubernetes/manifests/kube-apiserver.yaml
? ? ? ? ? 在spec.containers.command的最后面加上
? ? ? ? ? ? ? - --service-node-port-range=1-65535? ? ? ?
? ? ? ? ?重啟 kubelet
systemctl daemon-reload
systemctl restart kubelet
?
? ? ? 12. 部署網(wǎng)絡(luò)插件 kube-flannel?
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml
? 如果 wget 下載失敗,則新建 kube-flannel.yml, 并復(fù)制如下內(nèi)容。


--- 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.20.0 for ppc64le and mips64le (dockerhub limitations may apply) image: docker.io/rancher/mirrored-flannelcni-flannel:v0.20.0 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.20.0 for ppc64le and mips64le (dockerhub limitations may apply) image: docker.io/rancher/mirrored-flannelcni-flannel:v0.20.0 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
三:檢查 kubernetes 布署是否成功
kubectl cluster-info:查看 k8s 集群信息,包括 API Server 的地址和版本以及控制平面組件的狀態(tài)。
kubectl get nodes:查看集群中的節(jié)點(diǎn)信息,包括節(jié)點(diǎn)名稱、IP 地址、狀態(tài)和運(yùn)行時間等。
kubectl get pods:查看當(dāng)前命名空間下的 Pod 信息,包括 Pod 名稱、所屬節(jié)點(diǎn)、容器狀態(tài)、IP 地址等。
kubectl get pods,svc -o wide --all-namespaces :?查看 所有命名空間的 pods,svc 信息
kubectl get cs :? 查看集群健康狀態(tài)
kubectl describe service/kubernetes??
?四. kubernetes 常見問題
? 問題一:
-- The start-up result is done. Feb 02 20:51:43 master kubelet[14025]: E0202 20:51:43.774113 14025 run.go:74] "command failed" err="failed to load kubelet config file, path: /var/lib/kubelet/config.yaml, error: failed to load Kubelet config file /var/lib/kubelet/config.yaml, error failed to read kubelet config file \"/var/lib/kubelet/config.yaml\", error: open /var/lib/kubelet/config.yaml: no such file or directory" Feb 02 20:51:43 master systemd[1]: kubelet.service: main process exited, code=exited, status=1/FAILURE Feb 02 20:51:43 master systemd[1]: Unit kubelet.service entered failed state. Feb 02 20:51:43 master systemd[1]: kubelet.service failed.
? ?containerd 配置沒修改。修改后,重啟服務(wù)即可。
sed -i -r '/cri/s/(.*)/#\1/' /etc/containerd/config.toml systemctl restart containerd
?問題 二:
failed to pull and unpack image \\\"registry.k8s.io/pause:3.6\\\": failed to resolve reference
# 生成 containerd 的默認(rèn)配置文件
containerd config default > /etc/containerd/config.toml
# 查看 sandbox 的默認(rèn)鏡像倉庫在文件中的第幾行
cat /etc/containerd/config.toml | grep -n "sandbox_image"
# 使用 vim 編輯器 定位到 sandbox_image,將 倉庫地址修改成 阿里鏡像
vim /etc/containerd/config.toml
sandbox_image = " registry.aliyuncs.com/google_containers/pause:3.6"
# 重啟 containerd 服務(wù)
systemctl daemon-reload
systemctl restart containerd.service
?問題三:
E0202 22:18:22.949900 3017 memcache.go:265] couldn't get current server API group list: Get "https://10.0.0.206:6443/api?timeout=32s": tls: failed to verify certificate: x509: certificate signed by unknown authority (possibly because of "crypto/rsa: verification error" while trying to verify candidate authority certificate "kubernetes")
?當(dāng)重置集群后,需同步刪除 $HOME/.kube 目錄
rm -rf $HOME/.kube
?問題四:
Feb 11 12:53:30 master kubelet[24455]: E0211 12:53:30.929534 24455 pod_workers.go:1300] "Error syncing pod, skipping" err="network is not ready: container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:Network plugin returns error: cni plugin not initialized" pod="kube-system/coredns-66f779496c-q6gr4" podUID="98364c23-bc48-45ff-a6dd-60bafc36aa3a"
重啟 containerd 服務(wù):
systemctl restart containerd
?
五. 部署 nginx 服務(wù),檢查 kubenetes 服務(wù)運(yùn)行情況
? ?1. 創(chuàng)建 nginx 布署文件。
kind: Namespace apiVersion: v1 metadata: name: myserver #創(chuàng)建namespace --- kind: Deployment apiVersion: apps/v1 #可查詢它的api版本 kubectl explain deployment.apiVersion metadata: #定義pod元數(shù)據(jù)信息,可查詢它的下級子字段kubectl explain deployment.metadata labels: #定義deployment控制器標(biāo)簽 app: nginx-deployment-label #標(biāo)簽名稱以鍵值形式定義,可以定義多個,這里標(biāo)簽是app值為nginx-deployment-label name: nginx-deployment #deployment資源的名字 namespace: myserver #deployment所屬的namespace,默認(rèn)是defaule spec: #定義Deployment中容器的詳細(xì)信息,可通過kubectl explain deployment.spec查詢 replicas: 1 #定義創(chuàng)建出pod的副本數(shù),默認(rèn)值是1個pod selector: #定義標(biāo)簽選擇器,它跟上面的Deployment標(biāo)簽不是一回事,它是找下面template中定義的labels標(biāo)簽 matchLabels: #定義匹配的標(biāo)簽,必須要設(shè)置 app: nginx-selector #匹配的目標(biāo)標(biāo)簽,控制器會拿這個標(biāo)簽匹配下面的pod template: #定義模板,用來描述需要創(chuàng)建的pod作用 metadata: #定義模板元數(shù)據(jù) labels: #這個labels會繼承給這個yaml文件Deployment控制器創(chuàng)建的所有pod app: nginx-selector #這個labels的key是app,值是nginx-selector,它會繼承給下面的pod,和上面matchLabels.app: nginx-selector一樣 spec: #定義pod的詳細(xì)信息 containers: #定義pod中容器列表,可以定義多個pod - name: nginx-container #容器名稱 image: nginx:1.20 #容器鏡像 imagePullPolicy: Always #鏡像拉取策略 ports: #定義容器端口列表 - containerPort: 80 #定義一個端口 protocol: TCP #定義協(xié)議 name: http #端口名稱 - containerPort: 443 protocol: TCP name: https env: #給容器傳遞環(huán)境變量 - name: "password" #變量名稱,必須引號引起來 value: "123" #上面變量的值 - name: "age" value: "18" --- kind: Service apiVersion: v1 metadata: name: nginx-service labels: app: nginx-service-label #service資源的標(biāo)簽 namespace: myserver #所在的命名空間,與上面控制器必須在同一個命名空間 spec: type: NodePort #service類型是NodePort ports: #定義訪問端口,一個service可以定義多個端口的映射關(guān)系 - name: http #定義協(xié)議名稱 port: 80 #定義service端口,它可以和pod,node端口都不同,它是K8S中一個獨(dú)立子網(wǎng) protocol: TCP #定義類型 targetPort: 80 #目標(biāo)pod端口,當(dāng)訪問宿主機(jī)30003端口時就會轉(zhuǎn)達(dá)到pod的80端口 nodePort: 30003 #手動指定node節(jié)點(diǎn)暴露的端口,如果沒有指定端口,那service會隨機(jī)分配一個端口 - name: https port: 443 protocol: TCP targetPort: 443 nodePort: 30443 selector: app: nginx-selector #這個標(biāo)簽就是上面pod的標(biāo)簽,service通過這個標(biāo)簽來匹配對應(yīng)的pod
?
2. 布署 nginx 服務(wù)。
kubectl apply -f nginx.yaml
?
3. 驗證 nginx 服務(wù)啟動成功。
curl http://127.0.0.1:30003 curl http://10.0.0.206:30003
?
4. 驗證成功后,根據(jù)需要可以刪除 nginx 布署信息。
? 查看deployment信息
? ? ? ?kubectl get deployment -n <namespace>
? 刪除deployment配置
? ? ? kubectl delete deployment <deployment名> -n <namespace>
? 刪除 svc? 配置
? ? ? kubectl delete svc? svc名
kubectl delete deployment nginx-deployment -n myserver
kubectl delete svc nginx-service -n myserver
?
六. 布署?kubernetes-dashboard 服務(wù),進(jìn)行 kubernetes 集群管理
? ? ? 1. 下載 布署文件
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml
?
? ? ? 2. 修改 布署文件,使本機(jī)可以訪問
? ? ? ? ?新增type: NodePort 和 nodePort:31443,以便能實(shí)現(xiàn)非本機(jī)訪問
kind: Service apiVersion: v1 metadata: labels: k8s-app: kubernetes-dashboard name: kubernetes-dashboard namespace: kubernetes-dashboard spec: type: NodePort ports: - port: 443 targetPort: 8443 nodePort: 31443 selector: k8s-app: kubernetes-dashboard
? ? ? 3. 布署服務(wù)
kubectl apply -f recommended.yaml
? ? ? ?4. 創(chuàng)建登錄用戶信息
? ? ? ? ? ? Dashboard 支持 Kubeconfig 和 Token 兩種認(rèn)證方式,暫時選擇Token認(rèn)證方式登錄。
? ? ? ? ? ? a. 創(chuàng)建dashboard-adminuser.yaml 文件
cat > dashboard-adminuser.yaml << EOF apiVersion: v1 kind: ServiceAccount metadata: name: admin-user namespace: kubernetes-dashboard --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: admin-user roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cluster-admin subjects: - kind: ServiceAccount name: admin-user namespace: kubernetes-dashboard > EOF
? ? ? ? ?b. 執(zhí)行命令創(chuàng)建用戶
kubectl apply -f dashboard-adminuser.yaml
? ? ? ?5. 獲取 token,進(jìn)行 服務(wù)登錄。
kubectl -n kubernetes-dashboard create token admin-user
#生成過期時間為24小時的token
kubectl -n kubernetes-dashboard create token admin-user --duration=86400s
? ? ? 待定...文章來源:http://www.zghlxwxcb.cn/news/detail-825238.html
?
到了這里,關(guān)于服務(wù)器-Kubernetes (K8S)單機(jī)部署實(shí)戰(zhàn) -- 001的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!