目 錄
簡介................................................................................................................................. 4
1、PAAS平台基礎架構與環境說明.................................................................................. 5
1.1、Docker簡介及基本組件...................................... 5
1.Docker簡介.............................................. 5
2.Docker平台組成........................................... 6
1.2、Kubernetes簡介及基本組件.................................... 8
1.Kubernetes簡介........................................... 8
2.Kubernetes集群平台組成結構................................. 9
2、Kubernetes集群部署.................................................................................................. 11
2.1、系統說明................................................ 11
2.2、網絡架構及硬件配置........................................ 11
2.3、基礎環境部署............................................. 11
(1)修改主機名並配置映射.................................. 11
(2)關閉SELinux和防火牆.................................. 12
(3)刪除iptables防火牆規則................................. 12
(4)配置yum源.......................................... 12
2.4、部署Harbor倉庫.......................................... 13
(1)安裝Docker.......................................... 13
(2)安裝docker-compose.................................... 14
(3)部署Harbor.......................................... 14
(4)上傳鏡像............................................ 15
2.5、部署Kubernetes集群....................................... 16
(1)安裝Kubeadm......................................... 16
(2)初始化集群........................................... 16
(3)安裝Dashboard........................................ 18
(4)刪除污點............................................ 22
2.6、node節點加入集群......................................... 22
(1)node節點加入集群..................................... 22
(2)查看節點信息......................................... 22
3、Kubernetes的基本使用.............................................................................................. 24
3.1、基本操作................................................ 24
(1)kubectl語法.......................................... 24
(2)創建資源對象......................................... 26
(3)查看資源對象......................................... 26
(4)描述資源對象......................................... 26
(5)刪除資源對象......................................... 26
(6)容器操作............................................ 27
(7)Pod的擴容與縮容...................................... 27
(8)Pod的滾動升級....................................... 27
3.2、運行容器................................................ 27
(1)運行Nginx應用....................................... 27
(2)查看Pods............................................ 28
(3)開放端口............................................ 28
(4)測試Nginx應用....................................... 28
3.3、Kubernetes運維........................................... 29
(1)Node的隔離與恢復..................................... 29
(2)Pod動態擴容和縮放.................................... 29
(3)將Pod調度到指定的Node............................... 30
(4)應用滾動升級......................................... 32
3.4、部署博客系統............................................. 39
(1)配置NFS服務........................................ 39
(2)配置NFS PV持久化存儲................................ 40
(3)部署應用............................................ 41
(4)驗證應用............................................ 46
(5)訪問應用............................................ 47
簡介
chinaskills_cloud_paas.iso鏡像包含安裝Docker-ce服務的軟件包、部署Harbor2.1.0和Kubernetes1.18.1容器雲平台所需的鏡像以及nginx、wordpress、jenkins等應用鏡像。用戶通過Chinaskill_Cloud_PaaS.iso鏡像包中的文件可安裝 Docker-ce服務及構建Kubernetes.集群,並能通過提供的ngimx.、wordpress、jenkins等容器鏡像部署相應的應用。
chinaskills_cloud_paas.iso包含的具體內容如下:
編號 |
軟件包 |
詳細信息 |
1 |
yaml |
用於部署Dashboard與flannel網絡的yaml模板文件 |
2 |
plugins |
持續集成所需的離線插件 |
3 |
kubernetes-repo |
用於安裝kubernetes容器雲平台的基礎軟件包 |
4 |
images |
提供K8S平台、容器倉庫、持續集成、LNMP環境需要用到的所有容器鏡像;提供Wordpress、nginx、mysql、php、owncloud等服務與應用的容器鏡像包 |
5 |
harbor |
提供harbor倉庫所需要的的離線安裝包 |
6 |
docker-compose |
提供docker-compose編排服務 |
7 |
ChinaskillProject |
持續集成案例所需的代碼包 |
8 |
ChinaskillMall |
容器化部署商城所需的軟件包 |
9 |
k8s_master_install.sh k8s_node_install.sh |
提供K8S容器雲平台中master節點和node節點的安裝腳本 |
10 |
k8s_image_push.sh |
提供鏡像的上傳腳本 |
11 |
k8s_harbor_install.sh |
提供harbor容器倉庫的安裝腳本 |
1、PAAS平台基礎架構與環境說明
1.1、Docker簡介及基本組件
1.Docker簡介
Docker 是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然后發布到任何流行的Linux機器上,也可以實現虛擬化,容器是完全使用沙箱機制,相互之間不會有任何接口。
一個完整的Docker有以下幾個部分組成:
l Docker Client客戶端
l Docker Daemon守護進程
l Docker Image鏡像
l Docker Container容器
Docker引擎Docker Engine是C/S架構,主要有以下部件組成:
服務器(Docker daemon):后台運行的Docker daemon進程。Daemon進程用於管理Docker對象,包括鏡像(images)、容器(containers)、網絡(networks)、數據卷(data volumes)。
REST接口:同daemon交互的REST API接口。
客戶端(Docker client):命令行(CLI)交互客戶端。客戶端使用REST API接口同Docker daemon進行訪問。Docker服務的架構圖如圖1.1所示。
圖1.1 Docker服務的架構圖
2.Docker平台組成
圖1.2 Docker服務組成圖
運行一個Docker服務,組成包括Docker daemon服務器、Docker Client客戶端、Docker Image鏡像、Docker Registry庫、Docker Contrainer容器,如圖1.2所示。
(1)Docker鏡像:
是一個只讀模板,用於創建Docker容器,由Dockerfile文本描述鏡像的內容。鏡像定義類似“面對對象的類”,從一個基礎鏡像(Base Image)開始。構建一個鏡像實際就是安裝、配置和運行的過程,Docker鏡像基於UnionFS把以上過程進行分層(Layer)存儲,這樣更新鏡像可以只更新變化的層。Docker的描述文件為Dockerfile,Dockerfile是一個文本文件,基本指令包括:
FROM:定義基礎鏡像。
MAINTAINER :作者或維護者。
RUN:運行linux 命令。
ADD:增加文件或目錄。
EVN:定義環境變量。
CMD:運行進程。
(2)Docker容器:
是一個鏡像的運行實例。容器有鏡像創建,運行過程例如:
運行ubuntu操作系統鏡像,-I 前台交互模型,運行命令為/bin/bash
$ docker run -i -t ubuntu /bin/bash
運行過程如下:
拉取(pull)鏡像,Docker Engine 檢查ubuntu 鏡像是否存在,如果本地已經存在,使用該鏡像創建容器,如果不存在,Docker Engine從鏡像庫拉鏡像。
使用該鏡像創建新容器。
分配文件系統,掛載一個讀寫層,在讀寫層加載鏡像。
分配網絡/網橋接口,創建一個網絡接口,讓容器和主機通信。
從可用的IP池選擇IP地址,分配給容器。
執行命令/bin/bash。
捕獲和提供執行結果。
(3)Docker 倉庫:
Docker倉庫是Docker鏡像庫。Docker Registry也是一個容器。Docker Hub是Docker公司提供的互聯網公共鏡像倉庫。可以構建自己本地的鏡像倉庫,國內有些公司也構建了鏡像倉庫。包括阿里雲、新浪等。Docker 集群服務:Docker集群服務運行承租的Docker節點一起工作。目前支持swarm模式。
一個 Docker Registry 節點中可以包含多個倉庫(Repository);每個倉庫可以包含多個標簽(Tag);每個標簽對應一個鏡像。
一般而言,一個倉庫包含的是同一個軟件的不同版本的鏡像,而標簽則用於對應於軟件的的不同版本。可以通過 <倉庫名>:<標簽> 的格式來指定具體是哪個版本的鏡像。如果不給出標簽,將以 latest 作為默認標簽。
以 Ubuntu 鏡像 為例,ubuntu 是倉庫的名字,其內包含有不同的版本標簽,如,14.04, 16.04。可以通過 ubuntu:14.04,或者 ubuntu:16.04 來具體指定所需哪個版本的鏡像。如果忽略了標簽,比如ubuntu,那將視為 ubuntu:latest。
1.2、Kubernetes簡介及基本組件
1.Kubernetes簡介
Kubernetes是Google開源的容器集群管理系統,其提供應用部署、維護、 擴展機制等功能,如圖1.3所示。利用Kubernetes能方便地管理跨機器運行容器化的應用,其主要功能總結如下:
1) 使用Docker對應用程序包裝(package)、實例化(instantiate)、運行(run)。
2) 以集群的方式運行、管理跨機器的容器。
3) 解決Docker跨機器容器之間的通訊問題。
4) Kubernetes的自我修復機制使得容器集群總是運行在用戶期望的狀態。
圖1.3 Kubernetes的功能結構
2.Kubernetes集群平台組成結構
Kubernetes總體包含兩種角色,一個是Master節點,負責集群調度、對外接口、訪問控制、對象的生命周期維護等工作;另一個是Node節點,負責維護容器的生命周期,例如創建、刪除、停止Docker容器,負責容器的服務抽象和負載均衡等工作。其中Master節點上,運行着三個核心組件:API Server, Scheduler, Controller Mananger。Node節點上運行兩個核心組件:Kubelet, Kube-Proxy。API Server提供Kubernetes集群訪問的統一接口,Scheduler, Controller Manager, Kubelet, Kube-Proxy等組件都通過API Server進行通信,API Server將Pod, Service, Replication Controller, Daemonset等對象存儲在ETCD集群中。ETCD是CoreOS開發的高效、穩定的強一致性Key-Value數據庫,ETCD本身可以搭建成集群對外服務,它負責存儲Kubernetes所有對象的生命周期,是Kubernetes的最核心的組件。各個組件之間的關系詳情如圖1-4所示。
下面先大概介紹一下Kubernetes的核心組件的功能:
API Server: 提供了資源對象的唯一操作入口,其他所有的組件都必須通過它提供的API來操作資源對象。它以RESTful風格的API對外提供接口。所有Kubernetes資源對象的生命周期維護都是通過調用API Server的接口來完成,例如,用戶通過kubectl創建一個Pod,即是通過調用API Server的接口創建一個Pod對象,並儲存在ETCD集群中。
Controller Manager: 集群內部的管理控制中心,主要目的是實現Kubernetes集群的故障檢測和自動恢復等工作。它包含兩個核心組件:Node Controller和Replication Controller。其中Node Controller負責計算節點的加入和退出,可以通過Node Controller實現計算節點的擴容和縮容。Replication Controller用於Kubernetes資源對象RC的管理,應用的擴容、縮容以及滾動升級都是有Replication Controller來實現。
Scheduler: 集群中的調度器,負責Pod在集群的中的調度和分配。
Kubelet: 負責本Node節點上的Pod的創建、修改、監控、刪除等Pod的全生命周期管理,Kubelet實時向API Server發送所在計算節點(Node)的信息。
Kube-Proxy: 實現Service的抽象,為一組Pod抽象的服務(Service)提供統一接口並提供負載均衡功能。
圖1.4 kubernetes集群服務各組件關系
2、Kubernetes集群部署
2.1、系統說明
安裝運行環境系統要求為CentOS7.5,內核版本不低於3.10。
Docker版本為docker-ce-19.03.13。
Kubernetes版本為1.18.1。
2.2、網絡架構及硬件配置
節點角色 |
主機名 |
內存 |
硬盤 |
IP地址 |
Master Node |
master |
12G |
100G |
10.18.4.10 |
Worker Node |
node |
8G |
100G |
10.18.4.11 |
Harbor |
master |
12G |
100G |
10.18.4.10 |
2.3、基礎環境部署
本次實驗環境采用master + node兩個節點部署,node節點可以根據需求自主擴展。
(1)修改主機名並配置映射
所有節點修改主機名並配置映射。
master節點:
# hostnamectl set-hostname master
# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.18.4.10 master
10.18.4.11 node
node節點:
# hostnamectl set-hostname node
# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
10.18.4.10 master
10.18.4.11 node
郁悶 (2)關閉SELinux和防火牆
所有節點關閉SELinux:
# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
# setenforce 0
所有節點關閉防火牆:
# systemctl stop firewalld.service
# systemctl disable firewalld.service
(3)刪除iptables防火牆規則
所有節點清除iptables規則:
# iptables –F
# iptables –X
# iptables –Z
# /usr/sbin/iptables-save
(4)配置yum源
將Chinaskill_Cloud_PaaS.iso鏡像包上傳至master節點。
master節點:
# mount -o loop Chinaskill_Cloud_PaaS.iso /mnt/
# cp -rfv /mnt/* /opt/
# umount /mnt/
# mv /etc/yum.repos.d/CentOS-* /home
# cat << EOF >/etc/yum.repos.d/local.repo
[k8s]
name=k8s
baseurl=file:///opt/kubernetes-repo
gpgcheck=0
enabled=1
EOF
master節點安裝ftp服務器:
# yum install -y vsftpd
# vi /etc/vsftpd/vsftpd.conf
anon_root=/opt
# systemctl start vsftpd && systemctl enable vsftpd
node節點:
# mv /etc/yum.repos.d/CentOS-* /home
# cat << EOF >/etc/yum.repos.d/local.repo
[k8s]
name=k8s
baseurl=ftp://master/kubernetes-repo
gpgcheck=0
enabled=1
EOF
2.4、部署Harbor倉庫
在master節點執行腳本k8s_harbor_install.sh即可完成harbor倉庫的搭建,具體步驟參考如下(1)-(3)步驟。
(1)安裝Docker
Kubernetes默認的容器運行時仍然是Docker,使用的是kubelet中內置dockershim CRI實現。
所有節點安裝Docker-ce:
# yum install -y yum-utils device-mapper-persistent-data lvm2
# yum install -y docker-ce
啟動Docker:
# systemctl start docker
# systemctl enable docker
調整部分docker參數:
# tee /etc/docker/daemon.json <<-'EOF'
{
"insecure-registries" : ["0.0.0.0/0"],
"registry-mirrors": ["https://5twf62k1.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
# systemctl restart docker
(2)安裝docker-compose
在master節點安裝docker-conpose:
# cp -rfv /opt/docker-compose/v1.25.5-docker-compose-Linux-x86_64 /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
# docker-compose version
docker-compose version 1.25.5, build 8a1c60f6
docker-py version: 4.1.0
CPython version: 3.7.5
OpenSSL version: OpenSSL 1.1.0l 10 Sep 2019
(3)部署Harbor
導入鏡像:
# docker load -i /opt/images/Kubernetes.tar
解壓安裝包:
# cd harbor/
# tar -zxvf harbor-offline-installer-v2.1.0.tgz
# cd harbor
修改Harbor配置信息:
# cp harbor.yml.tmpl harbor.yml
# vi harbor.yml
hostname: 10.18.4.10 # 將域名修改為本機IP
harbor_admin_password: Harbor12345
#https: # 禁用https
# https port for harbor, default is 443
# port: 443
# The path of cert and key files for nginx
# certificate: /your/certificate/path
# private_key: /your/private/key/path
啟動Harbor:
# ./prepare
# ./install.sh --with-clair
登錄Harbor倉庫(http://10.18.4.10),如圖2.4-1所示:
圖2.4-1 Habor首頁
啟動、停止Harbor:
# docker-compose up -d
# docker-compose stop
# docker-compose restart
(4)上傳鏡像
將鏡像導入Harbor倉庫:
# cd /opt/images/
# ./k8s_image_push.sh
輸入鏡像倉庫地址(不加http/https): 10.18.4.10
輸入鏡像倉庫用戶名: admin
輸入鏡像倉庫用戶密碼: Harbor12345
您設置的倉庫地址為: 10.24.2.32,用戶名: admin,密碼: xxx
是否確認(Y/N): Y
進入Harbor倉庫library項目查看鏡像列表,如圖2.4-2所示。
2.5、部署Kubernetes集群
在master節點執行腳本k8s_master_install.sh即可完成K8S集群的部署,具體步驟參考如下(1)-(4)步驟。
(1)安裝Kubeadm
所有節點安裝Kubeadm工具:
# yum -y install kubeadm-1.18.1 kubectl-1.18.1 kubelet-1.18.1
# systemctl enable kubelet && systemctl start kubelet
(2)初始化集群
在master節點初始化集群:
# kubeadm init --kubernetes-version=1.18.1 --apiserver-advertise-address=10.18.4.10 --image-repository registry.aliyuncs.com/google_containers --pod-network-cidr=10.244.0.0/16
[init] Using Kubernetes version: v1.18.1
[preflight] Running pre-flight checks
[preflight] Pulling images required for setting up a Kubernetes cluster
..................
[addons] Applied essential addon: CoreDNS
[addons] Applied essential addon: kube-proxy
Your Kubernetes control-plane has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 10.18.4.10:6443 --token cxtb79.mqg7drycn5s82hhc \
--discovery-token-ca-cert-hash sha256:d7465b10f81ecb32ca30459efc1e0efe4f22bfbddc0c17d9b691f611082f415c
初始化完成后執行:
# mkdir -p $HOME/.kube
# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# sudo chown $(id -u):$(id -g) $HOME/.kube/config
查看集群狀態:
# kubectl get cs
NAME STATUS MESSAGE ERROR
scheduler Healthy ok
controller-manager Healthy ok
etcd-0 Healthy {"health":"true"}
查看節點狀態:
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master NotReady master 2m57s v1.18.1
可以發現master處於notready狀態,這是正常的,因為還沒有網絡插件,接下來安裝網絡后就變為正常了:
# kubectl apply -f yaml/kube-flannel.yaml
podsecuritypolicy.policy/psp.flannel.unprivileged created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.apps/kube-flannel-ds created
# kubectl get pods -A
NAMESPACE NAME READY STATUS RESTARTS AGE
kube-system coredns-7ff77c879f-7vj79 1/1 Running 0 14m
kube-system coredns-7ff77c879f-nvclj 1/1 Running 0 14m
kube-system etcd-master 1/1 Running 0 14m
kube-system kube-apiserver-master 1/1 Running 0 14m
kube-system kube-controller-manager-master 1/1 Running 0 14m
kube-system kube-flannel-ds-d5p4g 1/1 Running 0 11m
kube-system kube-proxy-2gstw 1/1 Running 0 14m
kube-system kube-scheduler-master 1/1 Running 0 14m
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 17m v1.18.1
(3)安裝Dashboard
創建證書:
# mkdir dashboard-certs
# cd dashboard-certs/
# kubectl create namespace kubernetes-dashboard
# openssl genrsa -out dashboard.key 2048
Generating RSA private key, 2048 bit long modulus
......................................+++
...........................................................+++
e is 65537 (0x10001)
# openssl req -days 36000 -new -out dashboard.csr -key dashboard.key -subj '/CN=dashboard-cert'
# openssl x509 -req -in dashboard.csr -signkey dashboard.key -out dashboard.crt
Signature ok
subject=/CN=dashboard-cert
Getting Private key
# kubectl create secret generic kubernetes-dashboard-certs --from-file=dashboard.key --from-file=dashboard.crt -n kubernetes-dashboard
安裝Dashboard:
# kubectl apply -f recommended.yaml
namespace/kubernetes-dashboard created
serviceaccount/kubernetes-dashboard created
service/kubernetes-dashboard created
secret/kubernetes-dashboard-certs created
secret/kubernetes-dashboard-csrf created
secret/kubernetes-dashboard-key-holder created
configmap/kubernetes-dashboard-settings created
role.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrole.rbac.authorization.k8s.io/kubernetes-dashboard created
rolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
clusterrolebinding.rbac.authorization.k8s.io/kubernetes-dashboard created
deployment.apps/kubernetes-dashboard created
service/dashboard-metrics-scraper created
deployment.apps/dashboard-metrics-scraper created
查看Dashboard 關聯Pod和Service的狀態:
# kubectl get pod,svc -n kubernetes-dashboard
NAME READY STATUS RESTARTS AGE
pod/dashboard-metrics-scraper-6b4884c9d5-f7qxd 1/1 Running 0 62s
pod/kubernetes-dashboard-5585794759-2c6xt 1/1 Running 0 62s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/dashboard-metrics-scraper ClusterIP 10.105.228.249 <none> 8000/TCP 62s
service/kubernetes-dashboard NodePort 10.98.134.7 <none> 443:30000/TCP 62s
創建serviceaccount和clusterrolebinding
# kubectl apply -f dashboard-adminuser.yaml
serviceaccount/dashboard-admin created
clusterrolebinding.rbac.authorization.k8s.io/dashboard-admin-bind-cluster-role created
在火狐瀏覽器訪問dashboard(https://IP:30000),如圖2.5-1所示:
圖2.5-1 Dashboard認證界面
獲取Token:
# kubectl -n kubernetes-dashboard describe secret $(kubectl -n kubernetes-dashboard get secret | grep dashboard-admin | awk '{print $1}')
Name: dashboard-admin-token-x9fnq
Namespace: kubernetes-dashboard
Labels: <none>
Annotations: kubernetes.io/service-account.name: dashboard-admin
kubernetes.io/service-account.uid: f780f22d-f620-4cdd-ad94-84bf593ca882
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1025 bytes
namespace: 20 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IkRWNXNrYWV6dFo4bUJrRHVZcmwtcTVpNzdFMDZYZjFYNzRzQlRyYmlVOGsifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlcm5ldGVzLWRhc2hib2FyZCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4teDlmbnEiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiZjc4MGYyMmQtZjYyMC00Y2RkLWFkOTQtODRiZjU5M2NhODgyIiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmVybmV0ZXMtZGFzaGJvYXJkOmRhc2hib2FyZC1hZG1pbiJ9.h5BGk2yunmRcA8U60wIJh0kWpRLI1tZqS58BaDy137k1SYkvwG4rfG8MGnoDMAREWd9JIX43N4qpfbivIefeKIO_CZhYjv4blRefjAHo9c5ABChMc1lrZq9m_3Br_fr7GonsYulkaW6qYkCcQ0RK1TLlxntvLTi7gWMSes8w-y1ZumubL4YIrUh-y2OPoi2jJNevn4vygkgxtX5Y9LlxegVYJfeE_Sb9jV9ZL7e9kDqmBIYxm5PBJoPutjsTBmJf3IFrf6vUk6bBWtE6-nZgdf6FAGDd2W2-1YcidjITwgUvj68OfQ5tbB94EYlJhuoAGVajKxO14XaE9NH0_NZjqw
輸入Token后進入Dashboard儀表盤界面,如圖2.5-2所示:
圖2.5-2 Kubernetes儀表盤
(4)刪除污點
出於安全考慮,默認配置下Kubernetes不會將Pod調度到Master節點。如果希望將master也當作Node節點使用,可以執行如下命令:
# kubectl taint node master node-role.kubernetes.io/master-
node/master untainted
2.6、node節點加入集群
在node節點執行腳本k8s_node_install.sh即可將node節點加入集群,具體步驟參考如下(1)-(2)步驟。
(1)node節點加入集群
在node節點執行以下命令加入集群:
# kubeadm join 10.18.4.10:6443 \
--token cxtb79.mqg7drycn5s82hhc --discovery-token-ca-cert-hash \
sha256:d7465b10f81ecb32ca30459efc1e0efe4f22bfbddc0c17d9b691f611082f415c
(2)查看節點信息
在master節點查看節點狀態:
# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 56m v1.18.1
node Ready <none> 60s v1.18.1
3、Kubernetes的基本使用
3.1、基本操作
(1)kubectl語法
kubectl命令語法如下:
# kubectl [command] [TYPE] [NAME] [flags]
命令語法解析:
l command:子命令。
l TYPE:資源類型。
l NAME:資源名稱。
l flags:命令參數。
kubectl命令選項如下:
l --alsologtostderr[=false]:同時輸出日志到標准錯誤控制台和文件。
l --api-version="":和服務端交互使用的API版本。
l --certificate-authority="":用以進行認證授權的.cert文件路徑。
l --client-certificate="":TLS使用的客戶端證書路徑。
l --client-key="":TLS使用的客戶端密鑰路徑。
l --cluster="":指定使用的kubeconfig配置文件中的集群名。
l --context="":指定使用的kubeconfig配置文件中的環境名。
l --insecure-skip-tls-verify[=false]:如果為true,將不會檢查服務器憑證的有效性,這會導致HTTPS鏈接變得不安全。
l --kubeconfig="":命令行請求使用的配置文件路徑。
l --log-backtrace-at=:0:當日志長度超過定義的行數時,忽略堆棧信息。
l --log-dir="":如果不為空,將日志文件寫入此目錄。
l --log-flush-frequency=5s:刷新日志的最大時間間隔。
l --logtostderr[=true]:輸出日志到標准錯誤控制台,不輸出到文件。
l --match-server-version[=false]:要求服務端和客戶端版本匹配。
l --namespace="":如果不為空,命令將使用此namespace。
l --password="":APIServer進行簡單認證使用的密碼。
l -s,--server="":Kubernetes API Server的地址和端口號。
l --stderrthreshold=2:高於此級別的日志將被輸出到錯誤控制台。
l --token="":認證到APIServer使用的令牌。
l --user="":指定使用的kubeconfig配置文件中的用戶名。
l --username="":APIServer進行簡單認證使用的用戶名。
l --v=0:指定輸出日志的級別。
l --vmodule=:指定輸出日志的模塊。
常用命令如下:
l kubectl annotate:更新資源的注解。
l kubectl api-versions:以“組/版本”的格式輸出服務端支持的API版本。
l kubectl apply:通過文件名或控制台輸入,對資源進行配置。
l kubectl attach:連接到一個正在運行的容器。
l kubectl autoscale:對replication controller進行自動伸縮。
l kubectl cluster-info:輸出集群信息。
l kubectl config:修改kubeconfig配置文件。
l kubectl create:通過文件名或控制台輸入,創建資源。
l kubectl delete:通過文件名、控制台輸入、資源名或者label selector刪除資源。
l kubectl describe:輸出指定的一個或多個資源的詳細信息。
l kubectl edit:編輯服務端的資源。
l kubectl exec:在容器內部執行命令。
l kubectl expose:輸入rc、svc或Pod,並將其暴露為新的kubernetes service。
l kubectl get:輸出一個或多個資源。
l kubectl label:更新資源的label。
l kubectl logs:輸出Pod中一個容器的日志。
l kubectl namespace:(已停用)設置或查看當前使用的namespace。
l kubectl patch:通過控制台輸入更新資源中的字段。
l kubectl port-forward:將本地端口轉發到Pod。
l kubectl proxy:為Kubernetes API Server啟動代理服務器。
l kubectl replace:通過文件名或控制台輸入替換資源。
l kubectl rolling-update:對指定的replication controller執行滾動升級。
l kubectl run:在集群中使用指定鏡像啟動容器。
l kubectl scale:為replication controller設置新的副本數。
l kubectl version:輸出服務端和客戶端的版本信息。
(2)創建資源對象
使用kubectl create命令可進行資源的創建。
根據Yaml配置文件一次性創建service和rc:
# kubectl create -f my-service.yaml -f my-rc.yaml
根據<directory>目錄下所有.yaml、.yml、.json文件的定義進行創建操作:
# kubectl create -f <directory>
(3)查看資源對象
查看所有Pod列表:
# kubectl get pods
查看rc和service列表:
# kubectl get rc,service
(4)描述資源對象
顯示Node的詳細信息:
# kubectl describe nodes <node-name>
顯示Pod的詳細信息:
# kubectl describe pods/<pod-name>
顯示由RC管理的Pod的信息:
# kubectl describe pods <rc-name>
(5)刪除資源對象
基於Pod.yaml定義的名稱刪除Pod:
# kubectl delete -f pod.yaml
刪除所有包含某個label的Pod和service:
# kubectl delete pods,services -l name=<label-name>
刪除所有Pod:
# kubectl delete pods --all
(6)容器操作
執行Pod的data命令,默認是用Pod中的第一個容器執行:
# kubectl exec <pod-name> data
指定Pod中某個容器執行data命令:
# kubectl exec <pod-name> -c <container-name> data
通過bash獲得Pod中某個容器的TTY,相當於登錄容器:
# kubectl exec -it <pod-name> -c <container-name> bash
(7)Pod的擴容與縮容
執行擴容縮容Pod的操作:
# kubectl scale rc redis --replicas=3
需要確認的是,在rc配置文件中定義的replicas數量,當執行上述命令的結果大於replicas的數量時,則執行的命令相當於擴容操作,反之則為縮容。可以理解為填寫的數量即需要的Pod數量。
注意:當需要進行永久性擴容時,不要忘記修改rc配置文件中的replicas數量。
(8)Pod的滾動升級
執行滾動升級操作:
# kubectl rolling-update redis -f redis-rc.update.yaml
注意:當執行rolling-update命令前需要准備好新的rc配置文件以及ConfigMap配置文件。rc配置文件中需要指定升級后需要使用的鏡像名稱,或者可以使用kubeclt rolling-update redis --image=redis-2.0命令直接指定鏡像名稱來直接升級。
3.2、運行容器
(1)運行Nginx應用
運行Nginx應用。
[root@master ~]# kubectl run nginx --image=10.18.4.10/library/nginx:latest
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/nginx created
(2)查看Pods
驗證Pods是否正常運行。
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-ccb467dc5-92tbn 1/1 Running 0 93s
……
(3)開放端口
使用expose將service的80端口開放出去。
[root@master ~]# kubectl expose deploy/nginx --port 80
service/nginx exposed
(4)測試Nginx應用
[root@master ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h18m
nginx ClusterIP 10.100.220.6 <none> 80/TCP 9s
[root@master ~]# curl 10.100.220.6:80
……
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
使用curl工具可以成功獲取到Nginx網頁信息,說明80端口已開放成功。
3.3、Kubernetes運維
(1)Node的隔離與恢復
在硬件升級、硬件維護等情況下,需要將某些Node隔離。使用kubectl cordon <node_name>命令可禁止Pod調度到該節點上,在其上運行的Pod並不會自動停止,管理員需要手動停止在該Node上運行的Pod。
[root@master ~]# kubectl cordon node
查看Node的狀態,可以觀察到在node的狀態中增加了一項SchedulingDisabled,對於后續創建的Pod,系統將不會再向該Node進行調度。
[root@master ~]# kubectl get nodes
通過kubectl uncordon命令可完成對Node的恢復。
[root@master ~]# kubectl uncordon node
[root@master ~]# kubectl get nodes
可以看到Node節點已恢復調度,允許Pod調度到該節點上。
通過kubectl drain <node>命令可實現對node節點的驅逐,該命令會刪除該節點上的所有Pod(DaemonSet除外),在其他Node上重新啟動它們。
(2)Pod動態擴容和縮放
在實際生產系統中,經常會遇到某個服務需要擴容的場景,也可能會遇到由於資源緊張或者工作負載降低而需要減少服務實例數量的場景。此時可以利用kubectl scale deployment命令來完成這些任務。
以Nginx Deployment為例,已定義的最初副本數量為1。
[root@master ~]# kubectl run nginx --image=10.18.4.10/library/nginx:latest
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
deployment.apps/nginx created
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-ccb467dc5-jlr4c 1/1 Running 0 40s
通過執行下面的命令將Nginx Deployment控制的Pod副本數量從初始的1更新為5。
[root@master ~]# kubectl scale deployment nginx --replicas=5
deployment.extensions/nginx scaled
執行kubectl get pods命令來驗證Pod的副本數量增加到5。
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-ccb467dc5-2f6n2 1/1 Running 0 34s
......
將--replicas設置為比當前Pod副本數量更小的數字,系統將會“殺掉”一些運行中的Pod,即可實現應用集群縮容。
[root@master ~]# kubectl scale deployment nginx --replicas=2
deployment.extensions/nginx scaled
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-ccb467dc5-bl4jp 1/1 Running 0 2m50s
nginx-ccb467dc5-jlr4c 1/1 Running 0 5m21s
(3)將Pod調度到指定的Node
Kubernetes的Scheduler服務(kube-scheduler進程)負責實現Pod的調度,整個調度過程通過執行一系列復雜的算法最終為每個Pod計算出一個最佳的目標節點,這一過程是自動完成的,用戶無法知道Pod最終會被調度到哪個節點上。有時可能需要將Pod調度到一個指定的Node上。此時,可以通過Node的標簽(Label)和Pod的nodeSelector屬性相匹配,來達到上述目的。
Label(標簽)作為用戶可靈活定義的對象屬性,在已創建的對象上,仍然可以隨時通過kubectl label命令對其進行增加、修改、刪除等操作。使用kubectl label給node打標簽的用法如下:
# kubectl label nodes <node-name> <label-key>=<label-value>
下面的示例,為node打上一個project=gcxt的標簽。
[root@master ~]# kubectl label nodes node project=gcxt
node/node labeled
如果想刪除Label,只需要在命令行最后指定Label的key名,並加一個減號即可。
[root@master ~]# kubectl label node node project-
node/node labeled
在Pod中加入nodeSelector定義,示例如下。
[root@master ~]# cat nginx.yaml
apiVersion: v1
kind: ReplicationController
metadata:
name: memcached-gcxt
labels:
name: memcached-gcxt
spec:
replicas: 1
selector:
name: memcached-gcxt
template:
metadata:
labels:
name: memcached-gcxt
spec:
containers:
- name: memcached-gcxt
image: memcached
command:
- memcached
- -m 64
ports:
- containerPort: 11211
nodeSelector:
project: gcxt
運行kubectl create -f命令創建Pod,scheduler就會將該Pod調度到擁有project=gcxt標簽的Node上去。
[root@master ~]# kubectl create -f nginx.yaml
replicationcontroller/memcached-gcxt created
查看Pod。
[root@master ~]# kubectl get pods -owide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
memcached-gcxt-hdt5x 1/1 Running 0 14s 10.24.9.2 node <none> <none>
可以看到,Pod已成功調度到指定的Node節點。
這種基於Label標簽的調度方式靈活性很高,比如,可以把一組Node分別貼上“開發環境”、“測試環境”、“生產環境”這3組標簽中的一種,此時一個Kubernetes集群就承載了3個環境,這將大大提高開發效率。
注意:如果指定了Pod的nodeSelector條件,且集群中不存在包含相應標簽的Node時,即使還有其他可供調度的Node,這個Pod也最終會調度失敗。
(4)應用滾動升級
當集群中的某個服務需要升級時,需要停止目前與該服務相關的所有Pod,然后重新拉取鏡像並啟動。如果集群規模比較大,這個工作就變成了一個挑戰。如果采取先全部停止,然后逐步升級的方式,會導致較長時間的服務不可用。Kubernetes提供了rolling-update(滾動升級)功能來解決上述問題。
滾動升級通過執行kubectl rolling-update命令一鍵完成,該命令創建了一個新的Deployment,然后自動控制舊的Deployment中的Pod副本數量逐漸減少到0,同時新的Deployment中的Pod副本數量從0逐步增加到目標值,最終實現了Pod的升級。
注意:系統要求新的Deployment需要與舊的Deployment在相同的命名空間(Namespace)內,即不能把別人的資產偷偷轉移到自家名下。
下面的示例在第一次部署時使用httpd:2.2.31,然后使用滾動升級更新到httpd:2.2.32。
定義httpd.yaml文件。
[root@master ~]# cat httpd.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: httpd
spec:
replicas: 3
template:
metadata:
labels:
run: httpd
spec:
containers:
- name: httpd
image: 10.18.4.10/library/httpd:2.2.31
ports:
- containerPort: 80
啟動Deployment。
[root@master ~]# kubectl create -f httpd.yaml
deployment.apps/httpd created
[root@master ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
httpd-5ddb558f47-46tf5 1/1 Running 0 49s
httpd-5ddb558f47-5dg96 1/1 Running 0 49s
httpd-5ddb558f47-672sk 1/1 Running 0 49s
查看Deployment。
[root@master ~]# kubectl get deployments httpd -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
httpd 3/3 3 3 93s httpd httpd:2.2.31 run=httpd
可以看到,IMAGES為httpd:2.2.31。
把配置文件中的httpd:2.2.31改為httpd:2.2.32,再次啟動。
[root@master ~]# cat httpd.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: httpd
spec:
replicas: 3
template:
metadata:
labels:
run: httpd
spec:
containers:
- name: httpd
image: 10.18.4.10/library/httpd:2.2.32 //將2.2.31更改為2.2.32
ports:
- containerPort: 80
[root@master ~]# kubectl apply -f httpd.yaml
deployment.apps/httpd configured
再次查看Deployment。
[root@master ~]# kubectl get deployments httpd -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
httpd 3/3 3 3 7m53s httpd httpd:2.2.32 run=httpd
查看Deployment的詳細信息。
[root@master ~]# kubectl describe deployment httpd
…...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal ScalingReplicaSet 22m deployment-controller Scaled up replica set httpd-5ddb558f47 to 3
Normal ScalingReplicaSet 15m deployment-controller Scaled up replica set httpd-8bdffc6d8 to 1
Normal ScalingReplicaSet 14m deployment-controller Scaled down replica set httpd-5ddb558f47 to 2
Normal ScalingReplicaSet 14m deployment-controller Scaled up replica set httpd-8bdffc6d8 to 2
Normal ScalingReplicaSet 14m deployment-controller Scaled down replica set httpd-5ddb558f47 to 1
Normal ScalingReplicaSet 14m deployment-controller Scaled up replica set httpd-8bdffc6d8 to 3
Normal ScalingReplicaSet 13m deployment-controller Scaled down replica set httpd-5ddb558f47 to 0
上面的日志信息就描述了滾動升級的過程:
① 啟動一個新版Pod。
② 把舊版Pod數量降為2。
③ 再啟動一個新版,數量變為2。
④ 把舊版Pod數量降為1。
⑤ 再啟動一個新版,數量變為3。
⑥ 把舊版Pod數量降為0。
這就是滾動的意思,始終保持副本數量為3,控制新舊Pod的交替,實現了無縫升級。
kubectl apply每次更新應用時,kubernetes都會記錄下當前的配置,保存為一個revision,這樣就可以回滾到某個特定的版本。
創建3個配置文件,內容中唯一不同的就是鏡像的版本號。
httpd.v1.yaml:
[root@master ~]# cat httpd.v1.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: httpd
spec:
revisionHistoryLimit: 10 # 指定保留最近的幾個revision
replicas: 3
template:
metadata:
labels:
run: httpd
spec:
containers:
- name: httpd
image: 10.18.4.10/library/httpd:2.2.16
ports:
- containerPort: 80
httpd.v2.yaml:
[root@master ~]# cat httpd.v2.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: httpd
spec:
revisionHistoryLimit: 10 # 指定保留最近的幾個revision
replicas: 3
template:
metadata:
labels:
run: httpd
spec:
containers:
- name: httpd
image: 10.18.4.10/library/httpd:2.2.17
ports:
- containerPort: 80
httpd.v3.yaml:
[root@master ~]# cat httpd.v3.yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: httpd
spec:
revisionHistoryLimit: 10 # 指定保留最近的幾個revision
replicas: 3
template:
metadata:
labels:
run: httpd
spec:
containers:
- name: httpd
image: 10.18.4.10/library/httpd:2.2.18
ports:
- containerPort: 80
部署Deployment。
[root@master ~]# kubectl apply -f httpd.v1.yaml --record
deployment.apps/httpd configured
[root@master ~]# kubectl apply -f httpd.v2.yaml --record
deployment.apps/httpd configured
[root@master ~]# kubectl apply -f httpd.v3.yaml --record
deployment.apps/httpd configured
--record的作用是將當前命令記錄到revision中,可以知道每個revision對應的是哪個配置文件。
查看Deployment。
[root@master ~]# kubectl get deployments -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
httpd 3/3 1 3 31m httpd 10.18.4.10/library/httpd:2.2.18 run=httpd
查看revision歷史記錄。
[root@master ~]# kubectl rollout history deployment httpd
deployment.extensions/httpd
REVISION CHANGE-CAUSE
1 <none>
2 <none>
3 kubectl apply --filename=httpd.v1.yaml --record=true
4 kubectl apply --filename=httpd.v2.yaml --record=true
5 kubectl apply --filename=httpd.v3.yaml --record=true
CHANGE-CAUSE即-record的結果。
執行如下操作,回滾到指定版本revision 1。
[root@master ~]# kubectl rollout undo deployment httpd --to-revision=1
deployment.extensions/httpd rolled back
[root@master ~]# kubectl get deployments -o wide
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
httpd 3/3 3 3 35m httpd 10.18.4.10/library/httpd:2.2.31 run=httpd
再次查看Deployment可以看到httpd版本已經回退了。
查看revision歷史記錄,可以看到revision記錄也發生了變化。
[root@master ~]# kubectl rollout history deployment httpd
deployment.extensions/httpd
......
3.4、部署博客系統
(1)配置NFS服務
master節點安裝NFS與RPC服務:
# yum install -y nfs-utils rpcbind
node節點安裝NFS客戶端:
# yum install -y nfs-utils
啟動RPC服務:
# systemctl start rpcbind
# systemctl enable rpcbind
查看NFS服務項RPC服務器注冊的端口列表:
# rpcinfo -p localhost
啟動NFS服務:
# systemctl start nfs
# systemctl enable nfs
啟動NFS服務后RPC服務已經啟用了對NFS的端口映射列表
# rpcinfo -p localhost
在服務器端創建2個共享目錄並設置權限:
# mkdir -p /home/pvdata/mysql
# mkdir -p /home/pvdata/wordpress
# chmod 777 /home/pvdata/mysql
# chmod 777 /home/pvdata/wordpress
修改NFS配置文件/etc/exports
# vim /etc/exports
/home/pvdata/mysql *(rw,sync,insecure,no_subtree_check,no_root_squash)
/home/pvdata/wordpress *(rw,sync,insecure,no_subtree_check,no_root_squash)
NFS配置文件生效
# exportfs -r
# exportfs
(2)配置NFS PV持久化存儲
創建mysql pv卷
# cat mysql-persistent-storage.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: mysql-persistent-storage
spec:
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: nfs
nfs:
path: /home/pvdata/mysql/
server: 10.18.4.10
# kubectl apply -f mysql-persistent-storage.yaml
創建wordpress pv卷:
# cat wordpress-persistent-storage.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: wordpress-persistent-storage
spec:
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: nfs
nfs:
path: /home/pvdata/wordpress/
server: 10.18.4.10
# kubectl apply -f wordpress-persistent-storage.yaml
(3)部署應用
通過以下命令在kustomization.yaml中添加一個Secret生成器:
# cat <<EOF >./kustomization.yaml
secretGenerator:
- name: mysql-pass
literals:
- password=123456ok
EOF
MySQL容器將PersistentVolume掛載在/var/lib/mysql。MYSQL_ROOT_PASSWORD環境變量設置來自Secret的數據庫密碼:
# cat mysql-deployment.yaml
apiVersion: v1
kind: Service
metadata:
name: wordpress-mysql
labels:
app: wordpress
spec:
ports:
- port: 3306
selector:
app: wordpress
tier: mysql
clusterIP: None
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: mysql-pv-claim
labels:
app: wordpress
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
name: wordpress-mysql
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: mysql
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: mysql
spec:
containers:
- image: 10.18.4.10/library/mysql:5.6
name: mysql
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
ports:
- containerPort: 3306
name: mysql
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: mysql-pv-claim
WordPress容器將網站數據文件位於/var/www/html的PersistentVolume。WORDPRESS_DB_HOST環境變量集上面定義的MySQLService的名稱,WordPress將通過Service訪問數據庫。WORDPRESS_DB_PASSWORD環境變量設置從Secretkustomize生成的數據庫密碼。
# cat wordpress-deployment.yaml
apiVersion: v1
kind: Service
metadata:
name: wordpress
labels:
app: wordpress
spec:
ports:
- port: 80
selector:
app: wordpress
tier: frontend
type: LoadBalancer
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wp-pv-claim
labels:
app: wordpress
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 20Gi
---
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
name: wordpress
labels:
app: wordpress
spec:
selector:
matchLabels:
app: wordpress
tier: frontend
strategy:
type: Recreate
template:
metadata:
labels:
app: wordpress
tier: frontend
spec:
containers:
- image: 10.18.4.10/library/wordpress:4.8-apache
name: wordpress
env:
- name: WORDPRESS_DB_HOST
value: wordpress-mysql
- name: WORDPRESS_DB_PASSWORD
valueFrom:
secretKeyRef:
name: mysql-pass
key: password
ports:
- containerPort: 80
name: wordpress
volumeMounts:
- name: wordpress-persistent-storage
mountPath: /var/www/html
volumes:
- name: wordpress-persistent-storage
persistentVolumeClaim:
claimName: wp-pv-claim
將以上兩個文件補充到kustomization.yaml文件中:
# cat <<EOF >>./kustomization.yaml
resources:
- mysql-deployment.yaml
- wordpress-deployment.yaml
EOF
kustomization.yaml包含用於部署 WordPress 網站的所有資源以及 MySQL 數據庫。通過以下方式部署應用:
# kubectl apply -k ./
secret/mysql-pass-ccht6ddg2m created
service/wordpress-mysql created
service/wordpress created
deployment.apps/wordpress-mysql created
deployment.apps/wordpress created
persistentvolumeclaim/mysql-pv-claim created
persistentvolumeclaim/wp-pv-claim created
(4)驗證應用
通過運行以下命令驗證Secret是否存在:
# kubectl get secrets
NAME TYPE DATA AGE
mysql-pass-ccht6ddg2m Opaque 1 39s
驗證是否已動態配置PersistentVolume,設置和綁定PV可能要花費幾分鍾:
# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
mysql-pv-claim Bound pvc-1f300520-7d33-4a2e-acdc-d09ef27f794a 20Gi RWO local-path 10m
wp-pv-claim Bound pvc-b13dddbd-0f1c-4b04-b6c0-677a1f50587b 20Gi RWO local-path 10m
通過運行以下命令來驗證Service是否正在運行:
# kubectl get services wordpress
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
wordpress LoadBalancer 10.109.26.194 <pending> 80:31355/TCP 10m
(5)訪問應用
通過http://10.18.4.10:31355訪問wordpress,如圖3.4-1所示:
圖3.4-1 wordpress初始化界面
創建用戶並登錄wordpress,如圖3.4-2所示:
圖3.4-2 wordpress首頁