1)自我修復html
2)彈性伸縮node
3)自動部署和回滾linux
4)服務發現和負載均衡nginx
5)機密和配置管理git
6)存儲編排github
7)批處理算法
1)Master組件docker
2)Node組件 bootstrap
1)Podcentos
2)Controller
3)更高級層次對象,部署和管理Pod
4)網絡解決方案
5)三種網絡
各個Pod運行在同一個網絡中,而service是另一個網絡;Pod和service的地址是不一樣網段的。
接入外部訪問時,先接入節點網絡,而後由節點網絡代理至集羣網絡,再由集羣網絡代理至Pod網絡。
同一Pod內的多個容器之間經過 lo 接口進行通訊。
兩個Pod之間能夠直接進行通訊:經過隧道的方式(Overlay疊加網絡)來轉發二層報文,使得它們雖然擴主機可是好像工做在同一個二層網絡中。訪問對方Pod所在節點的位置,而後再代理到Pod內部的容器上。
1)minikube
2)kubeadm
3)二進制包
1)環境需求
2)角色規劃
3)網絡模型
1)關閉防火牆、SELinux
# 關閉防火牆並設置開機禁止啓動 systemctl stop firewalld && systemctl disable firewalld # 關閉SELinux sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config && setenforce 0
2)關閉swap分區
# 臨時關閉全部swap swapoff -a # 在/etc/fstab中機制掛載swap sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
3)設置主機名並配置hosts
# 爲各個主機配置主機名 hostnamectl set-hostname k8s-master01 hostnamectl set-hostname k8s-node01 hostnamectl set-hostname k8s-node02 # 配置好主機名後將如下內容寫入到全部節點的 /etc/hosts 文件中 172.18.0.67 k8s-master01 172.18.0.68 k8s-node01 172.18.0.69 k8s-node02
4)內核調整
# 設置 net.bridge.bridge-nf-call-ip6tables = 1 # 設置 net.bridge.bridge-nf-call-iptables = 1 cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl --system # Load settings from all system configuration files
5)爲各個主機作時間同步
1)配置安裝源
cd /etc/yum.repos.d/ && wget -c https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo # 注意要修改下載下來的這個repo文件中的地址,將其指向爲清華的源的地址
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
2)安裝docker-ce
yum install -y docker-ce systemctl start docker && systemctl enable docker docker info # 安裝完成以後注意要爲docker配置好鏡像加速
3)安裝kubeadm、kubelet 和 kubectl
yum install kubelet kubeadm kubectl -y # 注意,要讓kubelet開機自啓,如今還不能去手動啓動它 systemctl enable kubelet
4)爲kubelet配置額外參數
# 能夠在 /etc/sysconfig/kubelet 這個文件中添加額外的參數 # 如關閉swap功能 KUBELET_EXTRA_ARGS="--fail-swap-on=false"
1)初始化master
kubeadm init \ --kubernetes-version v1.20.2 \ --pod-network-cidr=10.244.0.0/16 \ --service-cidr=10.96.0.0/12 \ --apiserver-advertise-address=172.18.0.67 \ --ignore-preflight-errors=Swap \ --image-repository registry.aliyuncs.com/google_containers # apiserver要修改爲本身的master節點的地址,默認apiserver監聽在全部地址的6443端口上 # 若是swap報錯,能夠加上選項--ignore-preflight-errors=Swap,可是注意那個Swap的S要大寫 # 因爲默認拉取鏡像地址k8s.gcr.io國內沒法訪問,這裏指定阿里雲鏡像倉庫地址
# 注意kubernetes的版本要和以前安裝的kubelet的版本一致
2)根據回顯提示操做
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config
3)測試
# 獲取組件狀態信息 kubectl get cs # cs是kubectl get componentstatus的簡寫,獲取組件狀態信息 # 查看k8s集羣的節點信息 kubectl get nodes
4)token失效解決
由於默認 token 的有效期爲24小時,過時以後該token就不可用了,因此若是後續有node節點加入,能夠從新生成新的token
[root@master01 ~]# kubeadm token create salxe7.gnlwtozqxxsf4uu7 [root@master01 ~]# kubeadm token list TOKEN TTL EXPIRES USAGES DESCRIPTION EXTRA GROUPS he4ugm.z537h1g7taugguco 23h 2021-01-19T15:53:34+08:00 authentication,signing <none> system:bootstrappers:kubeadm:default-node-token salxe7.gnlwtozqxxsf4uu7 23h 2021-01-19T15:53:48+08:00 authentication,signing <none> system:bootstrappers:kubeadm:default-node-token t4xdcj.5vgr19ymj4g6y7hm 6h 2021-01-18T22:31:08+08:00 authentication,signing <none> system:bootstrappers:kubeadm:default-node-token [root@master01 ~]#
[root@master01 ~]# openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //' 19060b637433363db284e831fce4bd567f82d8070b2744741dbe2f1cfa804d53
kubeadm join 172.18.0.67:6443 --token t4xdcj.5vgr19ymj4g6y7hm --discovery-token-ca-cert-hash sha256:19060b637433363db284e831fce4bd567f82d8070b2744741dbe2f1cfa804d53 --ignore-preflight-errors=Swap
註冊Node節點到Master
# kubeadm join 的內容,在上面kubeadm init 已經生成好了 kubeadm join 172.18.0.67:6443 --token t4xdcj.5vgr19ymj4g6y7hm --discovery-token-ca-cert-hash sha256:19060b637433363db284e831fce4bd567f82d8070b2744741dbe2f1cfa804d53 --ignore-preflight-errors=Swap
1)安裝flannel
# 這個地址可能訪問不到,能夠開小飛機手動把這個文件下載下來,而後再apply kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml # 執行的成功與否要看docker image ls中是否有flannel的鏡像,慢慢等待它下載便可
# 要確保可以訪問到 quay.io 這個registery
# 若是沒法訪問,能夠將此文件中image項後面的地址修改爲能夠訪問到的地址
2)查看是否安裝成功
# 注意,要確保狀態爲全1/1時,纔可進行後續操做 [root@k8s-master01 ~]# kubectl get pods -n kube-system NAME READY STATUS RESTARTS AGE coredns-7f89b7bc75-9zxjz 1/1 Running 0 12m coredns-7f89b7bc75-n8p4s 1/1 Running 0 12m etcd-k8s-master01 1/1 Running 0 12m kube-apiserver-k8s-master01 1/1 Running 0 12m kube-controller-manager-k8s-master01 1/1 Running 0 12m kube-flannel-ds-b5ljk 1/1 Running 0 7m58s kube-proxy-cwzkw 1/1 Running 0 12m kube-scheduler-k8s-master01 1/1 Running 0 12m # 確保全部節點爲Ready狀態 [root@k8s-master01 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION k8s-master01 Ready control-plane,master 93m v1.20.2 k8s-node01 Ready <none> 49m v1.20.2
3)flannel安裝失敗後重裝
kubectl delete -f kube-flannel.yml # 而後從新安裝 kebectl apply -f kube-flannel.yml
1)信息查看
# 查看k8s集羣的總體信息 kubectl cluster-info # 查看當前系統上已經被建立的控制器 kubectl get deployment # 查看pod的相關信息 kubectl get pods kubectl get pods -o wide # 查看更詳細的信息 # 查看services的相關信息 kubectl get services kubectl get svc # 查看kube-system名稱空間中service的相關信息 kubectl get svc -n kube-system
2)建立一個pod
# 建立並運行一個特定的鏡像,暴露80端口,而且只建立1個副本,幹跑模式須要再加上--dry-run=true kubectl run nginx-deploy --image=nginx:1.14 --port=80 --replicas=1
# 若是要鏡像中運行其餘程序,能夠寫成這樣(注意前面要加 -- ) kubectl run nginx-deploy --image=nginx:1.14 --port=80 --replicas=1 -- /bin/sh
3)對剛剛建立的pod進行查看並訪問
[root@k8s-master01 ~]# kubectl get pods -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES nginx-deploy 1/1 Running 0 3m6s 10.244.1.2 k8s-node01 <none> <none> [root@k8s-master01 ~]# curl 10.244.1.2
1)建立deployment
# 建立一個deployment控制器,這個控制器的名字就叫nginx-deploy kubectl create deployment nginx-deploy --image=nginx
2)建立service並暴露端口
kubectl expose deployment nginx-deploy --name=nginx --port=80 --target-port=80 --protocol=TCP # 將nginx-deploy這個控制器(deployment )相關的pod資源都建立爲一個服務,服務名叫nginx # --name 是service的名稱 # --port 是service暴露到外部的端口 # --target-port 是pod暴露的端口 # --protocol 使用的協議,默認就是TCP # --type 是service的類型,service有多種類型,可kubectl expose --help來查看--type選項,Defaultis 'ClusterIP'
3)查看相關信息並訪問
# 查看pod和service的相關信息 [root@k8s-master01 ~]# kubectl get pods,svc NAME READY STATUS RESTARTS AGE pod/nginx-deploy-8588f9dfb-t8wzr 1/1 Running 0 11m NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 78m service/nginx ClusterIP 10.99.193.184 <none> 80/TCP 34s # 查看kube-system名稱空間中service的相關信息 kubectl get svc -n kube-system # 訪問:http://NodeIP:PORT,只有在集羣內部的節點上才能被訪問到 curl http://10.99.193.184
參考: