k8s介紹html
k8s搭建一個應用(mysql+tomcat)node
kubetnetes介紹python
官網 https://kubernetes.io/mysql
Kubernetes也就是k8slinux
Kubernetes是一個開源系統,它主要用來自動部署、擴容縮容和管理容器應用。web
它將諸多應用的容器分爲若干個邏輯單元以便於管理和發現。Kubernetes擁有着在kubernetes中,service是核心,咱們並不須要太多關注kubernetes裏面是怎麼工做的,咱們只須要關心它給咱們提供什麼service。sql
就像docker容器能夠提供一個mysqld的服務、web服務等。docker
它須要擁有一個惟一的名字、有ip:port對外提供服務。數據庫
提供service的是容器,爲了保證service的高可用,提供service的容器不能只有一個,須要一組。這一組容器咱們把它叫作pod。json
爲了實現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
http://www.javashuo.com/article/p-rebchjwf-eq.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