116.k8s介紹、k8s搭建一個應用(mysql+tomcat)
k8s介紹
k8s搭建一個應用(mysql+tomcat)
kubetnetes介紹
官網 https://kubernetes.io/
Kubernetes也就是k8s
Kubernetes是一個開源系統,它主要用來自動部署、擴容縮容和管理容器應用。
它將諸多應用的容器分為若干個邏輯單元以便於管理和發現。Kubernetes擁有著在kubernetes中,service是核心,我們並不需要太多關注kubernetes裡面是怎麼工作的,我們只需要關心它給我們提供什麼service。
就像docker容器可以提供一個mysqld的服務、web服務等。
它需要擁有一個唯一的名字、有ip:port對外提供服務。
提供service的是容器,為了保證service的高可用,提供service的容器不能只有一個,需要一組。這一組容器我們把它叫做pod。
為了實現service和pod之間的關聯,又有了標籤(label)的概念,我們把功能相同的pod設定為同一個標籤,比如,可以把所有提供mysql服務的pod貼上標籤name=mysql,這樣mysql service要作用於所有包含name=mysql標籤的pod上。
pod執行在Node上,Node可以是一臺物理機,也可以是虛擬機器,通常一個Node上會執行幾百個pod。每個pod裡執行著一個特殊的容器,叫做Pause,其他容器叫做業務容器,業務容器共享Pause容器的網路棧和Volume掛載卷,因此同一個pod內的業務容器之間的通訊和資料交換更為高效。
在叢集管理方面,kubernetes將叢集中的機器劃分為一個master節點和一群工作節點Node,其中master上執行著kubeapiserver、kube-controller-manager、kube-scheduler,它們實現了資源管理、pod排程、彈性伸縮、安全控制、系統監
控、糾錯等功能。Node是工作節點,執行應用程式,提供服務。Node上的最小單元是pod,Node上執行著kubernetesd的kubelet、kube-proxy服務程序,它們負責pod的建立、啟動、監控、重啟、銷燬,以及實現負載均衡。
通過一組圖瞭解kubernetes各個元素的關係:
Google高負載生產環境的15年經驗,並結合了社群的優秀思想和實踐。
擴容和升級需要一個關鍵的東西,Replication controller(RC),RC需要包含3個關鍵資訊:
1)目標pod的定義
2)目標pod需要執行的副本數量(replicas)
3)要監控的目標pod的標籤(Label)
工作過程:RC裡定義好3個指標,kubernetes會根據RC定義的Label帥選出對應的pod,並實時監控其狀態和數量,當例項數量少於定義的副本數(replicas),則會根據RC定義的pod模版來建立新的pod,然後將此pod排程到合適的Node上啟動並執行。
可理解為pod的高可用,是rc來定義的(排程的)。可排程到其他正常的node上
該過程完全自動化,無需人工干涉。
從一個例子開始:
webapp(tomcat) + mysql
安裝kubernetes #此處只是單機安裝kubernetes,並不是安裝叢集
準備一臺centos7.5以上的版本
#cat /etc/redhad-release 來看一下版本。如果不是 yum update升級一下
1) 關閉firewalld 和 selinux
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
2)安裝etcd和kubernetes
yum install -y etcd kubernetes
#etcd是用來儲存kubernetes裡的叢集檔案的(存配置檔案配置的資料庫)
#安裝的時候報錯,與docker相關的衝突。分別刪除提示的那兩個docker相關的:
yum remove -y docker-ce.x86_64 0:18.03.0.ce-1.el7.centos
yum remove -y docker-ce*
3)修改配置檔案
vi /etc/sysconfig/docker
將--selinux-enabled 改為 --selinux-enabled=false --insecure-registry gcr.io
vi /etc/kubernetes/apiserver
把--admission_control引數中的ServiceAccount刪除
4)準備工作
yum install python-rhsm-certificates
如果提示python-rhsm-certificates-1.19.10-1.el7_4.x86_64 被已安裝的 subscription-manager-rhsm-certificates-
1.20.11-1.el7.centos.x86_64 取代,就要執行下面兩步驟:
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm
rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm |cpio -iv --to-stdout ./etc/rhsm/ca/redhatuep.pem > /etc/rhsm/ca/redhat-uep.pem
配置docker加速器
vi /etc/docker/daemon.json//加入如下內容
{
"registry-mirrors": ["https://dhq9bx4f.mirror.aliyuncs.com"]
}
5)按順序啟動所有服務
for s in etcd docker kube-apiserver kube-controller-manager kube-scheduler kubelet kube-proxy
do
systemctl start $s
done
6)建立一個rc檔案
vim mysql-rc.yaml #內容如下 #需注意空格
apiVersion: v1
kind: ReplicationController #副本控制器RC
metadata:
name: mysql #RC的名稱,全域性唯一
spec:
replicas: 1 #Pod副本的期待數量,如果這為10,那麼最終他們形成了一個service
selector:
app: mysql #符合目標的Pod擁有此標籤
template: #根據此模板建立Pod的副本(例項)
metadata:
labels:
app: mysql #Pod副本擁有的標籤,對應RC的Selector
spec:
containers: #Pod內容器的定義部分
- name: mysql #容器的名稱
image: mysql:5.6 #容器對應的Docker image。此處因為這個實驗太老了,所以加了個5.6版本的
ports:
- containerPort: 3306 #容器應用監聽的埠號
env: #注入容器內的環境變數
- name: MYSQL_ROOT_PASSWORD
value: "123456"
·················rc檔案內容到此結束·································
docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest #不用執行這兩步會自動拉取映象。這兩部如果手動執行,下面一步建立(create)之後,就會直接Running了。就不用等了
docker pull mysql:5.6
kubectl create -f mysql-rc.yaml #上一步定義好rc檔案,就可以去建立rc了
kubectl get rc #可檢視rc都有哪些。就是把所有的rc都get出來
[root@dazuoye02-01 ~]# kubectl get rc
NAME DESIRED CURRENT READY AGE
mysql 1 1 1 9m #拉取完之後,get rc的時候會顯示這個
kubectl get pods #通過pod看他的狀態。就是把所有的pod都get出來
[root@dazuoye02-01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
mysql-cqg9w 1/1 Running 0 7m #狀態為Running的時候就代表可以了
7)建立一個svc檔案
vim mysql-svc.yaml #注意空格
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
ports:
- port: 3306
selector:
app: mysql
·················svc檔案內容到此結束·································
kubectl create -f mysql-svc.yaml
kubectl get svc #下面會出現mysql
[root@dazuoye02-01 ~]# kubectl get svc
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.254.0.1 <none> 443/TCP 22m
mysql 10.254.215.180 <none> 3306/TCP 15s #這個ip就是sercice的ip,通過這個ip和prot就可以訪問這個mysql了
mysql -uroot -p123456 -h10.254.215.180 #可登陸mysql
8)建立web rc檔案
vim web-rc.yaml #注意空格
kind: ReplicationController
metadata:
name: myweb
spec:
replicas: 1
selector:
app: myweb
template:
metadata:
labels:
app: myweb
spec:
containers:
- name: myweb
image: kubeguide/tomcat-app:v1
ports:
- containerPort: 8080
env:
- name: MYSQL_SERVICE_HOST
value: '10.254.215.180' #這裡的IP需要通過kubect get svc 檢視mysql的cluster ip
- name: MYSQL_SERVICE_PORT
value: '3306'
·················web檔案內容到此結束·································
kubectl create -f web-rc.yaml
9)建立web svc檔案
vim web-svc.yamly
kind: Service
metadata:
name: myweb
spec:
type: NodePort
ports:
- port: 8080
nodePort: 30001 #意思是在ens33的ip上去訪問mysql服務,所以指定一個監聽埠(因為上面的mysql不是要用哪個指定的ip去訪問嗎),這個埠最低不能超過30000
selector:
app: myweb
·················web檔案內容到此結束·································
kubectl create -f web-svc.yaml #建立之前get pod檢視是否已啟動
10)訪問
iptables -P FORWARD ACCEPT #把forward規則開啟
curl 本機ip:30001/demo/ 或瀏覽器
以上,可以點選add去增加一行資料
去mysql看看有沒有這行資料:
mysql -uroot -p123456 -h10.254.215.180
show databases;
use HPE_APP
show tables;
select from * T_USERS;
+----+-----------+-------+
| ID | USER_NAME | LEVEL |
+----+-----------+-------+
| 1 | me | 100 |
| 2 | our team | 100 |
| 3 | HPE | 100 |
| 4 | teacher | 100 |
| 5 | docker | 100 |
| 6 | google | 100 |
| 7 | axin | 100 | #這就是剛剛在瀏覽器介面加的一行資料
+----+-----------+-------+
問題
https://blog.csdn.net/gezilan/article/details/80011905
https://www.cnblogs.com/neutronman/p/8047547.html
https://blog.csdn.net/d7185540/article/details/80868816
總結:
kebuctl create -f XXX #-f後面跟的是檔名。可以通過rc檔案建立rc,通過service(svc)檔案建立一個service(svc)
kebuctl get pod #檢視所有的pod
kubectl get svc #檢視所有的sercive
kubectl get rc #檢視所的rc