1. service
kubernetes中,Service(服務)是分佈式集羣架構的核心,一個Service對象擁有如下特徵。
1. 擁有一個唯一指定的名字(如:mysql-server)
2. 擁有一個虛擬IP(Cluster IP, Service IP或VIP)和端口號
3. 能夠提供某種遠程服務能力
4. 被映射到了提供這種服務能力的一組容器應用上
Service 的服務進程目前都基於Socket通信方式對外提供服務,比如Redis,Memcache,MySql , Wwb Server或者是實現了某個具體業務的一個特點的Tcp Server進程,雖然一個Service通常是由多個相關的服務進程來提供服務的每個服務都有一個獨立的Endpoint(IP+Port)訪問點,但kubernetes能夠讓我們通過Service(虛擬Cluster IP +Service Port)連接到指定的Service上,有了Kubernetes內建的透明負載均衡和故障恢復機制,不管後端多少服務進程,也不管某個服務進程是否會由於發生故障而重新部署到其他機器,都不會影響到我們對服務的正常調用。更重要的是這個Service 本身一旦創建就不再變化,這意味着,在Kubernetes
集羣中,我們再也不用爲了服務的IP地址變來變去的問題而頭疼了。
容器提供了強大的隔離功能,所以有必要把爲Service提供服務的這組進程放入容器中進行隔離。爲此,Kubernetes設計了Pod對象,將每個服務進程包裝到相應的Pod中,使其成爲Pod中運行的一個容器(Container)。 爲了建立Service和Pod間的關聯關係,Kubernetes 首先給每個Pod貼上一個標籤(Label), 給運行MySQL的Pod貼上name=mysql標籤,給運行PHP的 Pod貼上name=php標籤,然後給相應的Service 定義標籤選擇器(Label Selector),比如MySQLService的標籤選擇器的選擇條件爲name=mysql, 意爲該Service要作用於所有包含name= -mysqlLabel的Pod上。這樣一來,就巧妙地解決了Service 與Pod的關聯問題。
2. pod
Pod 運行在一個我們稱之爲節點(Node)的環境中,這個節點既可以是物理機,也可以是私有云或者公有云中的一個虛擬機,通常在一個節點_上運行幾百個Pod;其次,每個Pod裏運行着一個特殊的被稱之爲Pause的容器,其他容器則爲業務容器,這些業務容器共享Pause容器的網絡棧和Volume掛載卷,因此它們之間的通信和數據交換更爲高效,在設計時我們可以充分利用這-特性將--組密切相關的服務進程放入同一個Pod中;最後,需要注意的是,並不是每個Pod和它裏面運行的容器都能“映射”到一個Service. 上,只有那些提供服務(無論是對內還是對外)的一組Pod纔會被“映射”成一個服務。
3. rc
在Kubernetes 集羣中,你只需爲需要擴容的Service 關聯的Pod 創建一個ReplicationController(簡稱RC),則該Service的擴容以至於後來的Service升級等頭疼問題都迎刃而解。在一個RC定義文件中包括以下3個關鍵信息。
3.1 目標Pod的定義。
3.2 目標Pod需要運行的副本數量(Replicas)。
3.3 要監控的目標Pod的標籤(Label)。
在創建好RC (系統將自動創建好Pod)後,Kubermnetes 會通過RC中定義的Label篩選出對應的Pod實例並實時監控其狀態和數量,如果實例數量少於定義的副本數量(Replicas), 則會根據RC中定義的Pod模板來創建-一個新的Pod,然後將此Pod調度到合適的Node上啓動運行,直到Pod實例的數量達到預定目標。這個過程完全是自動化的,無須人工干預。有了RC,
4.環境準備
centos 7環境
4.1 關閉自帶防火牆
systemctl disable firewalld
systemctl stop firewalld
4.2 安裝etcd和kubernetes(自動安裝docker)
yum install -y etcd kubernetes
報錯:
Error: docker-ce-cli conflicts with 2:docker-1.13.1-109.gitcccb291.el7.centos.x86_64
Error: docker-ce conflicts with 2:docker-1.13.1-109.gitcccb291.el7.centos.x86_64
解決:
yum list installed | grep docker #過濾出安裝的docker 刪除
yum -y remove containerd.io.x86_64 docker-ce.x86_64 docker-ce-cli.x86_64
1.3 修改配置,其他使用默認參數
docker 配置文件(/etc/sysconfig/docker),其中OPTIONS的配置內容爲
OPTIONS='--selinux-enabled=false --insecure-registry gcr.io'
kubernetes apiserver配置文件爲/etc/kubernetes/apiserver,把--admission_control參數中的ServiceAccount刪除
1.4 按順序啓動所有服務
systemctl start etcd
systemctl start docker
systemctl start kube-apiserver
systemctl start kube-controller-manager
systemctl start kube-scheduler
systemctl start kubelet
systemctl start kube-proxy
單機版的kubernetes完成
docker 下載鏡像地址爲:https://hub.docker.com/u/kubeguide
2 啓動mysql 服務
2.1首先爲mysql服務創建一個RC定義文件:mysql-rc.yaml.如下
apiVersion: v1
kind: ReplicationController #副本控制器---RC
metadata:
name: mysql #RC的名稱,全局唯一
spec:
replicas: 1 #Pod副本期待數量
selector:
app: mysql #符合目標的Pod擁有此標籤
template: #根據此模板創建Pod的副本(實列)
metadata:
labels:
app: mysql #Pod副本擁有的標籤,對用RC的selector
spec:
containers: #Pod內容器定義的部分
- name: mysql #容器的名稱
image: mysql #容器對應的Docker Image
ports:
- containerPort: 3306 #容器暴露的端口號
env: #注入容器內的環境變量
- name: MYSQL_ROOT_PASSRD
value: "123456"
yaml定義文件中的kind 屬性,用來表明此資源對象的類型,比如這裏的值爲"ReplicationController",表示這是一個RC;spec 一節中是RC的相關屬性定義,比如 spec.selector是RC的poad標籤(Label)選擇器,即監控和管理擁有這些標籤的pod實例,確保當前集羣上始終有且僅有replicas個pod實例在運行,這裏設置replicas=1表示只能運行一個mysql pod實例,當集羣中運行的pod數量小於replicas時,RC會根據spec.template一節中定義的pod模板來生成一個新的pod實例,spec.template.metadata.labels指定了該pod的標籤,需要特別注意的是:這裏的labels必須匹配之前的spec.selector,否則此RC每次創建一個無法匹配label的pod,就會不停的嘗試創建新的pod,
創建好redis-master-controller.yaml文件以後,爲了將它發佈到kubernetes集羣中,我們在master節點上執行命令
kubectl create -f mysql-rc.yaml
查看創建的rc
kubectl get rc
查看pod創建的情況
kubectl get pod
看到一個mysql-xxxx的pod實例,這是kubernetes根據mysql這個rc的定義自動創建的pod.由於pod的調度和創建需要花費一定的時間,比如需要一定時間來確定調度到那個節點上,以及下載pod裏容器的鏡像需要一段時間,一開始我們看到的pod的狀態是pending,當pod成功創建完成以後,狀態最終會被更新爲running
我們通過docker ps指令查看正在運行的容器,發現提供pod容器已經正在運行了,此外,mysql pod 對應的容器還多創建了一個來自谷歌的pause容器,這就是pod的"根容器"
創建一個與之關聯的kubernetes Service------mysql 的定義文件
##mysql-svc.yaml
apiVersion: v1
kind: Service #表明是Kubernetes Service
metadata:
name: mysql #Service的全局唯一名稱
spec:
ports:
- port: 3306 #Service 提供服務的端口號
selector: #Service 對應的Pod擁有這裏定義的標籤
app: mysql
其中,metadata.name是service的服務名(ServiceName); port屬性則定義了Service的虛端口;spec.selector確定了哪些pod副本(實例)對應到本服務,類似地,我們通過kubectl create命令創建service對象
創建service
[root@server /data/mysql]# kubectl create -f mysql-svc.yaml
service "mysql" created
[root@server /data/mysql]# kubectl get svc
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes 10.254.0.1 <none> 443/TCP 4d
mysql 10.254.190.45 <none> 3306/TCP 10s
注意:mysql服務被分配了一個值爲10.254.190.45的cluster ip地址,這是一個虛地址,隨後,kubernetes集羣中其他新建的pod就可以通過service的cluster ip+端口號 6379來鏈接和訪問
在通常情況下,cluster ip是在service創建後由kubernetes系統自動分配到的,其他pod無法預先知道某個service的cluster ip地址,因此需要一個服務發現機制來找到這個服務,爲此最初的時候,kubectl巧妙的利用linux環境變量(Environment Variable)來解決這個問題,根據service的唯一名字,容器可以從環境變量中獲取到service對應的cluster ip,從而發起TCP/IP鏈接請求
3.啓動tomcat服務
3.1 創建myweb-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: 'mysql'
- name: MYSQL_SERVICE_PORT
value: '3306'
注意到上面rc對應的Tomcat容器引用MYSQL_SERVICE_HOST=mysql這個環境變量,而"mysql" 恰好是我們之前定義的MYSQL服務的服務名,完整rc的創建和體驗
kubectl create -f myweb-rc.yaml
[root@server /data/tomcat]# kubectl get pods
NAME READY STATUS RESTARTS AGE
mysql-t98m9 1/1 Running 0 6h
myweb-r7cft 1/1 Running 0 7s
創建service 的yaml文件
myweb-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: myweb
spec:
type: NodePort
ports:
- port: 8080
nodePort: 30001
selector:
app: myweb
注意type=NodePort和nodePort=30001的兩個屬性,表明此service開啓了nodeport方式的外放訪求模式,在kubernetes集羣之外,比如在本機瀏覽器裏可以通過30001這個端口訪問mweb(對應到8080的虛擬端口上)
通過瀏覽器訪問:
192.168.1.52:30001/demo
報錯解決:
https://blog.csdn.net/wanchaopeng/article/details/100928465