1 容器編排工具介紹
容器編排三套解決方案
kubernetes
mesos+marathon
machine+swarn+compose
1.1 Docker提供的容器編排方案
docker compose 單主機編排,只能面向一個docker主機進行編排
docker swarm 編排多主機dokcer,整合一個資源池,而后docker compose只需面向資源池進行編排
docker machine 將一個主機迅速初始化為能符合加入docker swarm集群中的先決條件
1.2 kubernetes編排方案
1) k8s特性
自動裝箱,自我修復,水平擴展,服務發現和負載均衡,自動發布和回滾,密鑰和配置管理,存儲編排,批量處理運行
2) k8s原理
用戶把創建、啟動容器的請求發動給master,master中的調度器去分析各nodes現有的可用資源狀態,找一個最佳適配的,nodes本地的docker engine負責啟動起來
3) Kubernetes組件
master:apiserver, controller-manager, scheduler
nodes: kubelet, kube-proxy, container
附加組件:etcd dashbord等
4) 邏輯構成:
- Pod
label(標簽):key=value
pod分兩類:
自主式的Pod
控制器管理的pod
- pod控制器
ReplicationController
ReplicaSet
Deployment
StatefulSet
DaemonSet
Job
CronJob
Horizontal Pod Autoscaler(HPA):自動伸縮pod,訪問量猛增,隨時擴大pod
- service: 管理同一類的pod信息,保存變更pod的信息,提供客戶端訪問
- CNI
flannel:網絡配置
calico:網絡配置、網絡策略
canel
節點網絡、集群網絡、pod網絡
2 安裝前kubernees環境准備
2.1 搭建Kubernetes集群環境有三種方式
1) Minikube安裝方式
Minikube是一個工具,可以在本地快速運行一個單點的Kubernetes,嘗試Kubernetes或日常開發的用戶使用。但是這種方式僅可用於學習和測試部署,不能用於生產環境。
https://kubernetes.io/docs/setup/minikube/
2) Kubeadm安裝方式(本次基於該方式)
kubeadm是一個kubernetes官方提供的快速安裝和初始化擁有最佳實踐(best practice)的kubernetes集群的工具,提供kubeadm init和kubeadm join,用於快速部署Kubernetes集群。目前kubeadm還處於beta 和alpha狀態,不推薦用在生產環境,但是可以通過學習這種部署方法來體會一些官方推薦的kubernetes最佳實踐的設計和思想。
kubeadm的目標是提供一個最小可用的可以通過Kubernetes一致性測試的集群,所以並不會安裝任何除此之外的非必須的addon。kubeadm默認情況下並不會安裝一個網絡解決方案,所以用kubeadm安裝完之后,需要自己來安裝一個網絡的插件。所以說,目前的kubeadm是不能用於生產環境的
https://kubernetes.io/docs/reference/setup-tools/kubeadm/kubeadm/
3) 二進制包安裝方式(生產部署的推薦方式)
從官方下載發行版的二進制包,手動部署每個組件,組成Kubernetes集群,這種方式符合企業生產環境標准的Kubernetes集群環境的安裝,可用於生產方式部署。
https://github.com/kubernetes/kubernetes/releases
https://www.cnblogs.com/kevingrace/category/839227.html #參考
#本次安裝環境
Kubernetes安裝要求:
內核3.10+或4+
docker版本要小於17.03
OS:centos7.4
k8s:v1.20.1
Kubernetes 機器環境:
master, etcd:192.168.100.161
node1:192.168.100.162
node2:192.168.100.163
2.2 環境准備
#配置源、安裝基本軟件
cd /etc/yum.repos.d/
mkdir bak
mv *.repo bak/
wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum clean all
yum makecache
yum repolist
yum -y install iproute net-tools lrzsz wget ntp* numactl psmisc vim bridge-util
cd
#時間同步
yum -y install chrony
systemctl enable chronyd.service && systemctl start chronyd.service
sed -i -e '/^server/s/^/#/' -e '1a server ntp.aliyun.com iburst' /etc/chrony.conf
systemctl restart chronyd.service
#關閉防火牆
systemctl stop firewalld.service && systemctl disable firewalld.service
#關閉selinux
setenforce 0
sed -ri 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
cat /etc/selinux/config | grep -w "SELINUX"
#關閉swap
swapoff -a
sed -i -r '/swap/s/^/#/' /etc/fstab
free -m
#設置時區
timedatectl set-timezone Asia/Shanghai
#配置hosts和修改主機名
cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.100.161 master
192.168.100.162 node01
192.168.100.163 node02
#分別修改各主機名
hostnamectl set-hostname master
hostnamectl set-hostname node01
hostnamectl set-hostname node02
#修改內核參數
echo "net.bridge.bridge-nf-call-iptables=1" >> /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-ip6tables=1" >> /etc/sysctl.conf
sysctl -p
#如果有如下報錯:
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: No such file or directory
sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: No such file or directory
解決方法:
安裝bridge-util軟件,加載bridge,br_netfilter模塊
yum install -y bridge-utils.x86_64
modprobe bridge
modprobe br_netfilter
chmod +x /etc/rc.local
echo "modprobe bridge" >>/etc/rc.local
echo "modprobe br_netfilter" >>/etc/rc.local
2.3 配置源、安裝docker和kubeadm
1) 配置docker源
wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
2) 配置k8s源
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
#添加好以后,查看一下
yum -y repolist
3) 安裝docker和kubeadm
yum install -y docker-ce kubelet kubeadm kubectl
systemctl start docker && systemctl enable docker &&systemctl enable kubelet
#kubele設置成開機啟動就行,不用現在啟動
3 安裝k8s (master端操作)
3.1 拉取鏡像
[root@master ~]# kubeadm config images list #獲取鏡像版本
[root@hwsrv-693199 ~]# bash k8s_get_images.sh #替換下版本號,然后在訪問外網的機器上執行
#!/bin/bash apiserver=k8s.gcr.io/kube-apiserver:v1.20.2 ctrl_manager=k8s.gcr.io/kube-controller-manager:v1.20.2 scheduler=k8s.gcr.io/kube-scheduler:v1.20.2 proxy=k8s.gcr.io/kube-proxy:v1.20.2 pause=k8s.gcr.io/pause:3.2 etcd=k8s.gcr.io/etcd:3.4.13-0 coredns=k8s.gcr.io/coredns:1.7.0 #下載鏡像 for i in $apiserver $ctrl_manager $scheduler $proxy $pause $etcd $coredns;do docker pull $i;done #導出鏡像 docker save -o k8s_images.tar.gz $apiserver $ctrl_manager $scheduler $proxy $pause $etcd $coredns chmod 755 k8s_images.tar.gz #刪除鏡像 for i in $apiserver $ctrl_manager $scheduler $proxy $pause $etcd $coredns;do docker rmi $i;done
[root@master ~]# docker load <k8s_images.tar.gz # 3個節點都需要load
3.2 初始化k8s
[root@master ~]# sed -i 's/KUBELET_EXTRA_ARGS=/KUBELET_EXTRA_ARGS="--fail-swap-on=false"/g' /etc/sysconfig/kubelet
[root@master ~]# kubeadm init --image-repository=k8s.gcr.io --kubernetes-version=v1.20.2 --apiserver-advertise-address=192.168.100.161 --pod-network-cidr=10.244.0.0/16 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap
--image-repository:這個用於指定從什么位置來拉取鏡像(1.13版本才有的),默認值是k8s.gcr.io,我們將其指定為國內鏡像地址:registry.aliyuncs.com/google_containers
--kubernetes-version:指定kubenets版本號,默認值是stable-1,會導致從https://dl.k8s.io/release/stable-1.txt下載最新的版本號,我們可以將其指定為固定版本
--apiserver-advertise-address 指明用 Master 的哪個 interface 與 Cluster 的其他節點通信。如果 Master 有多個 interface,建議明確指定,如果不指定,kubeadm 會自動選擇有默認網關的 interface。
--pod-network-cidr指定 Pod 網絡的范圍。Kubernetes 支持多種網絡方案,而且不同網絡方案對 --pod-network-cidr有自己的要求,這里設置為10.244.0.0/16 是因為我們將使用 flannel 網絡方案,必須設置成這個 CIDR。
3.3 根據初始化的提示配置kubectl
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
[root@master ~]# kubectl get cs 查看集群狀態
NAME STATUS MESSAGE ERROR
controller-manager Healthy ok
scheduler Healthy ok
etcd-0 Healthy {"health": "true"}
#遇到的問題:
注釋掉/etc/kubernetes/manifests下的kube-controller-manager.yaml和kube-scheduler.yaml的- – port=0。
[root@master ~]# kubectl get nodes #查看節點信息
NAME STATUS ROLES AGE VERSION
master.magedu.com NotReady master 5m22s v1.13.4
3.4 安裝pod網絡
1) 安裝Weave網絡
export kubever=$(kubectl version | base64 | tr -d '\n')
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$kubever"
2) 查看
[root@master ~]# docker images #下載下面兩個鏡像很慢,預計20分鍾
kubectl get pods -A
kubectl get nodes #狀態改變了
#更多pod網絡解決方案,請參考http://docs.kubernetes.org.cn/459.html#34pod
4 node節點加入k8s集群(nodes端操作)
1) 確保node節點上有以下鏡像 ,把master上的拿過來就行了
#根據maser上 kubeadmin init執行結果的提示,在2台node上分別執行如下命令
kubeadm join 192.168.100.161:6443 --token 9zx9rt.t95m0qis1iyx85oi \
--discovery-token-ca-cert-hash sha256:1276e8641c573280371e87249f74d2b65bfcc60e76040ff88bd6c078b7cfaef7
2) master中的節點認證信息24小時會失效,可以用下面方法重新生成
#創建token
[root@master ~]# kubeadm token create
#創建新的sha
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
#加入集群
kubeadm join 172.16.20.102:6443 --token 【token】--discovery-token-ca-cert-hash sha256:【sha值】
5 基本使用
1、在master創建一個myapp的應用,副本數量為3
vim myapp-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-deploy
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
ports:
- containerPort: 80
name: http
kubectl apply -f myapp-deploy.yaml
可以通過以下一些命令查看應用的狀態等信息
kubectl get deployment -w
kubectl get pods -o wide
2、service發布應用
kubectl expose deployment myapp-deploy --name=myapp-svc --port 80
kubectl get svc
3、發布應用,外部可以訪問
kubectl edit svc myapp-svc
type: ClusterIP 將 ClusterIP 修改為NodePort
kubectl get svc
在集群外部訪問http://192.168.100.167:32602/
4、擴容myapp應用
kubectl scale --replicas=5 deployment myapp-deploy
kubectl get pod -o wide
5、縮容myapp應用
kubectl scale --replicas=3 deployment myapp-deploy
kubectl get pod -o wide
6、滾動更新
#kubectl set image deployment [控制器名] [容器名]=ikubernetes/myapp:v2
kubectl get deployment -o wide
kubectl set image deployment myapp myapp=ikubernetes/myapp:v2
7、查看滾動更新過程
# kubectl rollout status deployment myapp
8、更新完成后,查看鏡像版本
# kubectl get deployment myapp -o wide
9、回滾
# kubectl rollout undo deployment myapp
10、刪除應用
# kubectl delete deployment myapp
# kubectl delete svc myapp