1. 程式人生 > >116.k8s介紹、k8s搭建一個應用(mysql+tomcat)

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