基礎(chǔ)介紹
概念
本質(zhì)是一組服務(wù)器集群,在集群每個節(jié)點(diǎn)上運(yùn)行特定的程序,來對節(jié)點(diǎn)中的容器進(jìn)行管理。實(shí)現(xiàn)資源管理的自動化。
功能
- 自我修復(fù)
- 彈性伸縮
- 服務(wù)發(fā)現(xiàn)
- 負(fù)載均衡
- 版本回退
- 存儲編排
組件
- 控制節(jié)點(diǎn)(master)-控制平面
APIserver:資源操作的唯一入口
scheduler :集群資源調(diào)度,將Pod調(diào)度到node節(jié)點(diǎn)上
controlManager:維護(hù)集群狀態(tài),程序部署狀態(tài)
Etcd:存儲各種資源對象信息(數(shù)據(jù)庫-可替換)
- 工作節(jié)點(diǎn)(node)-數(shù)據(jù)平面,提供數(shù)據(jù)環(huán)境
Kubelet:負(fù)責(zé)維護(hù)生命周期,創(chuàng)建、更新、銷毀docker容器
Docker:容器操作
KuberProxy:集群內(nèi)部服務(wù)發(fā)現(xiàn)和負(fù)載均衡
概念
Master:控制節(jié)點(diǎn)
Node:工作節(jié)點(diǎn)
Pod: 最小工作單元,容器運(yùn)行在pod上
Controller:控制器,實(shí)現(xiàn)對pod的管理
Service:pod的統(tǒng)一入口
Label:標(biāo)簽,對pod分類
Namespace:命名空間,隔離pod環(huán)境
工作流程
[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機(jī)制,建議將圖片保存下來直接上傳(img-HMDSFZa4-1689145689993)(C:\Users\ricar\AppData\Roaming\Typora\typora-user-images\image-20230618235232615.png)]
集群搭建
類型:
一主多從
多主多從
基于三臺機(jī)器搭建集群
環(huán)境配置
IP
192.168.1.220 ricardo-1 #主節(jié)點(diǎn) 192.168.1.221 ricardo-2 #從節(jié)點(diǎn) 192.168.1.222 ricardo-3 #從節(jié)點(diǎn)
關(guān)閉防火墻
#臨時關(guān)閉 systemctl stop firewalld #永久關(guān)閉 systemctl disable firewalld
關(guān)閉selinux
#永久關(guān)閉 sed -i '/selinux/s/enforcing/disabled/' /etc/selinux/config #臨時關(guān)閉 setenforce 0
關(guān)閉swap分區(qū)
# 臨時關(guān)閉 swapoff -a # 注釋到swap那一行 永久關(guān)閉 vim /etc/fstab
設(shè)置主機(jī)名稱
hostnamectl set-hostname ricardo-1 hostnamectl set-hostname ricardo-2 hostnamectl set-hostname ricardo-3
添加主機(jī)名與IP對應(yīng)關(guān)系(三臺主機(jī)都執(zhí)行)
cat >> /etc/hosts << EOF 192.168.1.220 ricardo-1 192.168.1.221 ricardo-2 192.168.1.222 ricardo-3 EOF
將橋接的IPv4流量傳遞到iptables的鏈(三臺主機(jī)都執(zhí)行):
cat > /etc/sysctl.d/k8s.conf << EOF net.ipv4.ip_forward = 1 net.ipv4.tcp_tw_recycle = 0 net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF
sysctl --system
時間同步
yum install ntpdate -y ntpdate time.windows.com
Docker安裝
安裝需要的軟件包, yum-util 提供yum-config-manager功能
yum install -y yum-utils device-mapper-persistent-data lvm2
設(shè)置 yum 源(阿里云)
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
選擇docker版本并安裝
yum list docker-ce --showduplicates | sort -r
安裝
sudo yum install -y docker-ce-19.03.0 docker-ce-cli-19.03.0
配置鏡像加速
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "exec-opts": ["native.cgroupdriver=systemd"], "registry-mirrors": ["https://5w5kf152.mirror.aliyuncs.com"] } EOF
啟動 Docker 并設(shè)置開機(jī)自啟
systemctl restart docker && systemctl enable docker
K8s安裝
添加阿里云 yum 源(都安裝)
cat > /etc/yum.repos.d/kubernetes.repo << EOF [Kubernetes] name=kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF
kubeadm、kubelet、kubectl 的安裝(都安裝)
版本對應(yīng)關(guān)系
k8s與docker版本對應(yīng)關(guān)系
#下載軟件 yum install -y kubelet-1.18.0 kubeadm-1.18.0 kubectl-1.18.0 #開機(jī)自啟動 systemctl enable kubelet
在 Master 節(jié)點(diǎn)中部署集群-
(只在master節(jié)點(diǎn)執(zhí)行)
kubeadm init --kubernetes-version=1.18.0 \ --apiserver-advertise-address=192.168.1.220 \ --image-repository registry.aliyuncs.com/google_containers \ --service-cidr=10.10.0.0/16 --pod-network-cidr=10.122.0.0/16
開啟 kubectl 工具的使用(
該命令在master節(jié)點(diǎn)中執(zhí)行
)mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
將 node 節(jié)點(diǎn)加入 master 中的集群(
該命令在工作節(jié)點(diǎn)node中執(zhí)行
)。kubeadm join 192.168.1.220:6443 --token 88gcei.gmh12c7jmh6ksgj6 \ --discovery-token-ca-cert-hash sha256:8a3f8919183a5ff0fe8626615195a044a74b0ea3a004e41c013095d28eea83dc #重新創(chuàng)建 kubeadm token create --print-join-command
安裝網(wǎng)絡(luò)插件(CNI) 下面兩個中選一個,
calico
# 下載calico插件的yaml wget https://docs.projectcalico.org/v3.14/manifests/calico.yaml --no-check-certificate #修改定義pod網(wǎng)絡(luò)CALICO_IPV4POOL_CIDR的值 vim calico.yaml # 修改定義pod網(wǎng)絡(luò)CALICO_IPV4POOL_CIDR的值和kubeadm init pod-network-cidr的值一致 ## 取消注釋 - name: CALICO_IPV4POOL_CIDR value: "10.122.0.0/16" kubectl apply -f calico.yaml #查看運(yùn)行狀態(tài) kubectl get pods -n kube-system [root@ricardo-1 k8s]# kubectl get nodes NAME STATUS ROLES AGE VERSION ricardo-1 Ready master 43m v1.18.0 ricardo-2 Ready <none> 41m v1.18.0 ricardo-3 Ready <none> 41m v1.18.0
fannel(如果用了上面的calico就不要用這個了)
# 下載flannel插件的yml wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml # 修改kube-flannel.yml中的鏡像倉庫地址為國內(nèi)源 sed -i 's/quay.io/quay-mirror.qiniu.com/g' kube-flannel.yml # 安裝網(wǎng)絡(luò)插件 kubectl apply -f kube-flannel.yml
控制臺-dashboard 安裝
安裝
#版本地址 https://github.com/kubernetes/dashboard/releases?page=1 #下載配置文件 wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.4/aio/deploy/recommended.yaml #修改 39行 spec: type: NodePort ports: - port: 443 targetPort: 8443 nodePort: 31001 selector: k8s-app: kubernetes-dashboard #啟動 kubectl apply -f recommended.yaml #查看 kubectl get pods -n kubernetes-dashboard #打開網(wǎng)頁 https://192.168.1.220:31001/ 鼠標(biāo)點(diǎn)擊空白處,輸入:thisisunsafe #服務(wù)器生成token(master節(jié)點(diǎn)) #1、創(chuàng)建賬號 kubectl create serviceaccount dashboard-admin -n kubernetes-dashboard #2、創(chuàng)建集群角色權(quán)限綁定 kubectl create clusterrolebinding kube-dashboard-admin --clusterrole=cluster-admin --serviceaccount=kubernetes-dashboard:dashboard-admin #3、獲取賬號token kubectl get secret -n kubernetes-dashboard | grep dashboard-admin kubectl describe secrets dashboard-admin-token-zcvnc -n kubernetes-dashboard #token 粘到 web端 eyJhbGciOiJSUzI1NiIsImtpZCI6InE5NHpxbWhwc0FmVjhhSUZ4bElhZ19JbXVfSXpPNkFhVHFyUE9vc1A5MkUifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4temN2bmMiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiMTc5YjdmYzItOWU2Ny00MTcwLThkYmYtZGJlODU0MzNhM2MxIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXMtZGFzaGJvYXJkOmRhc2hib2FyZC1hZG1pbiJ9.f_klKo1n-5cg0UEFodRojtd5hTs3BTL6tFNi0G6aZWalyJuQioodkM3pW1I2d7HaIaKP61XJPRyq9YZEQp9SHsa_guCXMF83JmF5yG8G0hAQbDWyO7DnaFnoGK1RcaH5PioyVOrCOZEYwzwEPtObeXeqnVzNFI4kR1cfIpRefpuhm8dKP06PNpiQRMhLPXWThw1LmCL0OmnPlKyVJJNi2toPS7jxG3LFMhJZR_DA3jOf9kFUXL_v29V2cRzRIU1_cN0t3wsmrPahV3D7LlHAnLVRaV6L-C6X5_l88WwDebDTm4Ag20MLLRE5zeLq6lFh38FWy86IOivinSavysWuwA #修改token持續(xù)時間(默認(rèn) 15分鐘 600s) 修改命名空間 kubernetes-dashboard deployment kubernetes-dashboard contaiiners下 args參數(shù) 新增 --token-ttl=43200 #日志 kubectl logs -f -n kubernetes-dashboard kubernetes-dashboard-7b544877d5-r4jjw
常用命令
# 獲得節(jié)點(diǎn)
kubectl get nodes
#查看pod
kubectl get pods -A
kubectl get pods -n kube-system
kubectl get pod -n kube-system -o wide
#pod狀態(tài)
kubectl describe pod coredns-57d4cbf879-xgk2f -n kube-system
kubectl logs -f coredns-57d4cbf879-xgk2f -n kube-system
#查看狀態(tài)
systemctl status kubelet
systemctl status kubelet.service --now
#日志 - 節(jié)點(diǎn)日志
journalctl -f -u kubelet
journalctl -u kubelet
#開機(jī)自啟動
systemctl enable kubelet
#重啟
systemctl restart kubelet
#查看狀態(tài)
systemctl status kubelet
#查看命名空間
kubectl get ns
#創(chuàng)建空間
kubectl create namespace dev
#重置
kubeadm reset
#reset后刪除
rm -rf $HOME/.kube
# 查看k8s的pod網(wǎng)段和svc網(wǎng)段 kubeadm的配置信息存在config-map中
kubectl -n kube-system describe cm kubeadm-config |grep -i pod
# 查看pod網(wǎng)段和svc網(wǎng)段
kubectl -n kube-system describe cm kubeadm-config |grep -i net
部署第一個應(yīng)用-Nginx
基礎(chǔ)介紹
概念
- Namespace 表示命名空間:應(yīng)用需在命名空間下
- Deployment :即發(fā)布pod,因?yàn)閜od是最小單位
- Service: 暴露服務(wù)到外部的方式,包括LoadBlancer Service、NodePort Service、Ingress,即配置一個對外訪問的入口
基礎(chǔ)流程
因此,部署應(yīng)用的步驟基本是 先創(chuàng)建命名空間, 再創(chuàng)建pod,再創(chuàng)建service
1、創(chuàng)建命名空間
文件:nginx-namespace.yaml
apiVersion: v1 kind: Namespace metadata: name: dev labels: name: dev
名詞:
kind:Namespace 表示yaml文件創(chuàng)建的是命名空間
metadata表示命名空間的元信息
metadata.name 是命名空間的名稱 取值dev
metadata.labels 是命名空間的標(biāo)簽 name=dev
應(yīng)用
kubectl create -f namespace-dev.yaml
2、創(chuàng)建Deployment
文件:deployment-nginx.yaml
apiVersion: apps/v1 kind: Deployment metadata: labels: app: nginx name: nginx-deployment1 namespace: dev spec: replicas: 3 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - image: nginx:1.14.0 ports: - containerPort: 80 name: nginx
以下參數(shù)自定義時可選
spec: containers: - image: nginx:1.14.0 ports: - containerPort: 80 name: nginx volumeMounts: #k8s的master服務(wù)器對應(yīng)的路徑,必須存在 - name: conf mountPath: /etc/nginx/nginx.conf - name: log mountPath: /var/log/nginx - name: html mountPath: /etc/nginx/html tolerations: - key: "key" operator: "Equal" value: "nginx" effect: "NoSchedule" volumes: #k8s的node對應(yīng)的路徑 - name: conf #和volumeMounts中的內(nèi)容要對應(yīng) hostPath: path: /Users/w/kube/nginx/conf/nginx.conf - name: log #和volumeMounts中的內(nèi)容要對應(yīng) hostPath: path: /Users/w/kube/nginx/logs type: Directory - name: html #和volumeMounts中的內(nèi)容要對應(yīng) hostPath: path: /Users/w/kube/nginx/html type: Directory
名詞:
kind: Deployment表示yaml文件創(chuàng)建的是一個Deployment發(fā)布
metadata表示這個deployment的元信息
metadata.name 是deployment的名稱 nginx-deployment1
metadata.labels 是deployment的標(biāo)簽 即:app=nginx
metadata.namespace 是deployment的命名空間,此處選擇的是第一步創(chuàng)建的命名空間nginxspec: 表示deployment的詳細(xì)參數(shù)配置說明
spec.replicas 是啟動幾個pod節(jié)點(diǎn)
spec.template.spec 是deployment選擇模塊的詳細(xì)說明
spec.template.spec.containers 表示選擇的容器是什么,此處是nginx的docker鏡像 nginx:1.14.0,容器的端口設(shè)置 containerPort: 80, volumeMounts表示綁定的文件和目錄spec.template.spec.volumes 表示選擇的容器掛載的宿主機(jī)的文件和目錄 conf, log和html
應(yīng)用:
kubectl create -f deployment-nginx.yaml #初次創(chuàng)建 kubectl apply -f deployment-nginx.yaml #后期更新 #查看 kubectl get pods -n dev kubectl describe pod nginx-deployment1-6cb86fb6b7-kkpbw -n dev kubectl delete pod nginx-deployment1-6cb86fb6b7-txkkj -n dev kubectl describe deployment nginx -n dev
3、創(chuàng)建service
文件:service-nginx.yaml
apiVersion: v1 kind: Service metadata: labels: app: nginx name: nginx-deployment1 namespace: dev spec: ports: - port: 9000 protocol: TCP targetPort: 80 nodePort: 31090 selector: app: nginx type: NodePort
名詞:
kind: Service表示yaml文件創(chuàng)建的是一個Service
metadata表示這個Service的元信息
metadata.name 是Service的名稱 nginx-deployment1
metadata.labels 是Service的標(biāo)簽 即:app=nginx
metadata.namespace 是Service的命名空間,此處選擇的是第一步創(chuàng)建的命名空間nginx
sepc是Service的詳細(xì)配置說明
sepc.type 取值NodePort 表示這個Service的類型是一個節(jié)點(diǎn)端口轉(zhuǎn)發(fā)類型
sepc.selector 表示這個Service是將帶標(biāo)簽的哪些pods做為一個集合對外通過服務(wù)
sepc.ports.port 是Service綁定的端口
sepc.ports.name: nginx-service80 表示Service服務(wù)的名稱
sepc.ports.protocol: TCP 表示Service轉(zhuǎn)發(fā)請求到容器的協(xié)議是TCP,我們部署的http的nginx服務(wù),因此選擇協(xié)議為TCP
sepc.ports.targetPort: 80 表示Service轉(zhuǎn)發(fā)外部請求到容器的目標(biāo)端口80,即deployment的pod容器對外開放的容器端口80
sepc.ports.nodePort: 31090 表示Service對外開放的節(jié)點(diǎn)端口應(yīng)用
kubectl apply -f service-nginx.yaml #查看 kubectl get services -n dev kube kubectl describe service nginx-deployment1 -n nginx kubectl delete services nginx-deployment1 -n nginx
4、測試
地址
192.168.1.220:31090
效果:
報錯解決
錯誤描述 dial tcp 10.96.0.1:443: connect: no route to host文章來源:http://www.zghlxwxcb.cn/news/detail-715555.html
- systemctl stop docker
- systemctl stop kubelet
- iptables --flush
- iptables -tnat --flush
- systemctl start kubelet
- systemctl start docker
錯誤 Unable to update cni config: No networks found in /etc/cni/net.d文章來源地址http://www.zghlxwxcb.cn/news/detail-715555.html
mkdir -p /etc/cni/net.d cat > /etc/cni/net.d/10-flannel.conflist << EOF { "name": "cbr0", "plugins": [ { "type": "flannel", "delegate": { "hairpinMode": true, "isDefaultGateway": true } }, { "type": "portmap", "capabilities": { "portMappings": true } } ] } EOF
到了這里,關(guān)于K8s(kubernetes)集群搭建及dashboard安裝、基礎(chǔ)應(yīng)用部署的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!