1. 內容編排與kubernetes介紹
- 支持集群環境內容編排的工具kubernetes 簡稱k8s.
- k8s是谷歌官方提供的,底層基於docker,與docker-swarm是競爭關系。
- 集群容器管理領域幾乎都是采用的k8s。
k8s的職責
-
自動化容器的部署和復制
-
隨時擴展或收縮容器規模
-
容器分組Group,並且提供容器間的負載均衡
-
實時監控,即時故障發現,自動替換
2.k8s基本概念
- k8s Master 主節點
- Node 節點
- Service 服務
- Replication Controller 復制控制器
- Label 標簽
- Container 容器
- Pod k8s最小控制單元
Master
Master是集群的網關和中樞樞紐,主要作用:暴露API接口,跟蹤其他服務器的健康狀態、以最優方式調度負載,以及編排其他組件之間的通信。單個的Master節點可以完成所有的功能,但是考慮單點故障的痛點,生產環境中通常要部署多個Master節點,組成Cluster.
Node
Node是k8s的工作節點,負責接收來自Master的工作指令,並根據指令相應地創建和銷毀Pod對象,以及調整網絡規則進行合理路由和流量轉發。生產環境中,Node節點可以有N個。
Pod
- pod是容器的容器,可以包含多個Container
- 是k8s最小的可部署的單元,一個Pod就是一個進程
- pod內部容器的網絡互通,每個pod都有獨立的虛擬ip
- pod都是部署完整的應用或者模塊
kubelet kube-proxy docker
3. k8s安裝
國內安裝k8s途徑
- 使用kubeadmin離線安裝
- 使用阿里公有雲平台k8s
- 通過yum官方倉庫
- 二進制包形式安裝,kubeasz
3.1 安裝kubeadmin加載k8s鏡像
# 以下命令在三台虛擬機執行 yz10 yz20 yz21
mkdir /usr/local/k8s-install
cd /usr/local/k8s-install
4. k8s離線部署
10.211.55.10 yz10 Master節點
10.211.55.20 yz20 Node節點
10.211.55.21 yz21 Node節點
# 1. 調整時區
timedatectl set-timezone Asia/Shanghai
# 2. 關閉selinux和防火牆
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
systemctl disable firewalld
systemctl stop firewalld
# 3. k8sadmin鏡像下載附帶對應的docker
# 4. 鏡像上傳到每個節點
mkdir -p /usr/local/k8s-install
scp -r kubernetes-1.14 root@yz10:/usr/local/k8s-install
# 5. 安裝docker,記得配置加速器
tar -xf docker-ce-18.09.tar.gz
cd docker
yum localinstall -y *.rpm
# 6. 確認cgroup為 cgroupfs
docker info|grep cgroup
# 7. 安裝kubeadm
tar -xf kube114-rpm.tar.gz
cd kube114-rpm
yum localinstall -y *.rpm
# 8. 關閉交換區
swapoff -a #關閉
vi /etc/fstab
# 注釋這行 永久關閉
#/dev/mapper/centos-swap swap swap defaults 0 0
# 9. 配置網橋
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
# 10. 通過鏡像安裝k8s
docker load -i k8s-114-images.tar.gz
docker load -i flannel-dashboard.tar.gz
5. 構建k8s集群
確保上述節點都已經安裝好了k8s。
# master主服務器網絡設置
kubeadm init --kubernetes-version v1.14.1 --pod-network-cidr 10.244.0.0/16
# 運行完畢后查看需要手動運行的命令
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
# 查看節點, 可以看到只有一個master節點
kubectl get nodes
NAME STATUS ROLES AGE VERSION
yz10 NotReady master 5m21s v1.14.1
# 查看存在問題的pod
kubectl get pod --all-namespaces
# pending 是需要安裝flannel網絡組件
kubectl create -f /usr/local/k8s-install/kubernetes-1.14/kube-flannel.yml
# 再次查看,已經處於running狀態
kubectl get pod --all-namespaces
# 查看master的token
kubeadm token list
# 其余節點加入master節點集群
kubeadm join 10.211.55.10:6443 --token 63zvtd.rej4gqrhselysqsb --discovery-token-unsafe-skip-ca-verification
master節點運行: kubectl get nodes
可以看到,集群已經部署完畢。
6. k8s設置重啟服務
- kubeadm 是k8s集群快速構建工具
- kubelet 運行在所有節點上,負責啟動pod和容器,以系統服務的形式出現
- kubectl 是k8s命令行工具,提供指令
systemctl start kubelet
設置開機啟動 systemctl enable kubelet
7.開啟WebUI Dashboard
# master開啟儀表盤
kubectl apply -f kubernetes-dashboard.yaml
kubectl apply -f admin-role.yaml
kubectl apply -f kubernetes-dashboard-admin.rbac.yaml
kubectl -n kube-system get svc
# 查看pod情況,dashbord running正常
kubectl get pods --all-namespaces
# 遇到問題可以刪除pod,重新配置
kubectl -n kube-system delete pod/{podName}
訪問 http://宿主機ip:32000/ 即可進入dashbord
8.dashbord 部署tomcat集群
工作負載 -》 創建 即可
9.deployment腳本部署tomcat集群
- 部署是指k8s向node節點發送指令創建容器的過程
- k8s支持yml格式的部署腳本
- kubectl create -f 部署文件.yml
編寫第一個k8s部署腳本文件:
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: tomcat-deploy
spec:
replicas: 2
template:
metadata:
labels:
app: tomcat-cluster
spec:
containers:
- name: tomcat-cluster
image: tomcat
ports:
- containerPort: 8080
與部署相關的常用命令:
- kubectl create -f 部署文件.yml -》 創建部署
- kubectl apply -f 部署文件.yml -》 更新部署配置
- kubectl get pod [-o wide] -》 查看已部署pod
- kubectl describe pod pod名稱 -》 查看pod詳細信息
- kubectl logs [-f] pod名稱 -》 查看pod輸出日志
# 創建tomcat容器
kubectl create -f tomcat-deploy.yml
# 查看部署
kubectl get deployment
10. 外部訪問tomcat集群
service 服務用於對外暴露應用。
編寫服務 tomcat-service.yml
apiVersion: v1
kind: Service
metadata:
name: tomcat-service
labels:
app: tomcat-service
spec:
type: NodePort
selector:
app: tomcat-cluster
ports:
- port: 18010
targetPort: 8080
nodePort: 32500
# 創建負載均衡服務
kubectl create -f tomcat-service.yml
# 查看服務
kubectl get service
11. 基於NFS實現集群文件共享
- nfs主要是采用遠程過程調用RPC機制實現文件傳輸
- yum install -y nfs-utils rpcbind
# 編輯nfs共享文件設置
vi /etc/exports
/usr/local/data/www-data 10.211.55.10/24(rw,sync)
systemctl start nfs.service
systemctl start rpcbind.service
systemctl enable nfs.service
systemctl enable rpcbind.service
# exportfs查看
exportfs
/usr/local/data/www-data
10.211.55.10/24 # 說明配置生效
# 節點安裝工具
yum install -y nfs-utils
# 節點安裝完畢后
showmount -e yz10
# 掛載文件
mkdir -p /mnt/www-data
mount yz10:/usr/local/data/www-data /mnt/www-data
12. 部署配置掛載點
# 查看deployment
kubectl get deployment
# 刪除部署,服務service
kubectl delete deployment tomcat-deploy
kubectl delete service tomcat-service
# 重新部署掛載
vi tomcat-deploy.yml # 修改部署文件
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: tomcat-deploy
spec:
replicas: 2
template:
metadata:
labels:
app: tomcat-cluster
spec:
volumes:
- name: webapp
hostPath:
path: /mnt/www-data
containers:
- name: tomcat-cluster
image: tomcat
ports:
- containerPort: 8080
volumeMounts:
- name: webapp
mountPath: /usr/local/tomcat/webapps
# 進入pod查看掛載是否成功
kubectl exec -it tomcat-deploy-6dcc5c59c-hg5z7 bash
13. 利用 Rinetd 對外提供Service以及負載均衡支持
vi tomcat-service.yml 修改服務文件
apiVersion: v1
kind: Service
metadata:
name: tomcat-service
labels:
app: tomcat-service
spec:
# type: NodePort
selector:
app: tomcat-cluster
ports:
- port: 18010
targetPort: 8080
# nodePort: 32500
# 創建服務
kubectl create -f tomcat-service.yml
# 在www-data 創建一個test目錄創建文件
vi index.jsp
<%=request.getLocalAddr()%>
# 訪問
curl http://10.97.80.216:18010/test/index.jsp
可以觀察到隨機負載均衡的效果。
端口轉發工具 Rinetd
- Rinetd 是Linux操作系統中為重定向傳輸控制協議工具
- 可以將源ip端口數據轉發到目標ip端口
- 在k8s中用於將service服務對外暴露
# 宿主機安裝Rinted
cd /usr/local
http://www.rinetd.com/download/rinetd.tar.gz
cd rinetd
sed -i 's/65536/65535/g' rinetd.c
mkdir -p /usr/man/
yum install -y gcc
make && make install
# 編寫端口映射配置
vi /etc/rinetd.conf
0.0.0.0 18010 10.97.80.216 18010
# 加載配置
rinetd -c /etc/rinetd.conf
# 測試外部訪問,已經可以通了
http://yz10:18010/test/
14. 更新集群配置與資源限定
k8s部署調整命令
- 更新集群配置: kubectl apply -f yml文件
- 刪除部署|服務|pod
- kubectl delete deployment | service | pod 名稱
資源限定
containers:
- name: tomcat-cluster
image: tomcat
resources:
requests: # 需要的資源
cpu: 1
memory: 500Mi
limits: # 限制的資源
cpu: 2 # cpu不一定是整數
memory: 1024Mi
本文由 奔跑的雜糧煎餅 發布!