單機版Kubernetes集群(一)


環境:CentOS Linux release 7.4.1708 (Core)
 
單機版Kubernetes集群的效果,如圖:
1)JSP頁面通過JDBC直接訪問Mysql數據庫並展示;這里只是為了實現,只要程序正確連接到了數據庫上,它就會自動完成對應的Table的創建與初始化數據的准備工作。也就是當通過瀏覽器訪問此應用的時候,就會顯示一個表格,表格的數據來自數據庫
 
 
一、基本環境
 
1、關閉防火牆(自己寫的腳本)
 
 
#!/bin/bash#
 
#FileName: iptables_stop.sh
#Date: 20181029
#Author: LiLe
#Contact: 836217653@qq.com
#Version: V1.0
#Description: Centos7 stop firewalld in grain
 
install(){
    yum -y install firewalld
    yum -y install iptables-services
}
 
stop_service(){
    systemctl stop firewalld
    systemctl stop iptables
}
 
starting_stop(){
    systemctl disable firewalld.service
    systemctl disable iptables.service
}
 
main(){
    install
    stop_service
    starting_stop
}
 
main
 
 

 

 
2、安裝k8s 
yum -y install etcd kubernetes
 
  
3、把Kubernetes apiserver配置文件/etc/kubernetes/apiserver里的--admission-control的ServiceAccount刪除 
 
 
4、啟動所有的服務 
systemctl start etcd                          master
systemctl start docker                        node  
systemctl start kube-apiserver                master
systemctl start kube-controller-manager       master
systemctl start kube-scheduler                master
systemctl start kubelet                       node
systemctl start kube-proxy                    node
 
 
二、啟動Mysql服務
 
1、為Mysql創建一個RC定義文件,mysql-rc.yaml
 
 
 
 
apiVersion: v1
kind: ReplicationController     #表明此資源對象的內型,"ReplicationController表明這是一個RC"
metadata:
  name: mysql                   #RC的名稱,全局唯一
spec:                           #spec是RC的相關屬性定義
  replicas: 1                   #副本期待數量
  selector:                     #是RC的Pod標簽選擇器,監控和管理擁有這些標簽的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.
    app: mysql                  #符合目標的Pod擁有此標簽
  template:                     #根據此模板創建Pod的副本(實例)
    metadata:
      labels:
        app: mysql              #Pod副本擁有的標簽,對應RC的Selector
    spec:
      containers:               #Pod內容器的定義部分
      - name: mysql             #容器的名稱
        image: mysql            #容器的鏡像
        ports:                  #容器暴露的端口
        - containerPort: 3306
        env:                    #注入到容器內的環境變量
        - name: MYSQL_ROOT_PASSWORD
          value: "123456"
 
 
 
2、將mysql-controller發布到Kubernetes集群中 
kubectl create -f mysql-rc.yaml

 

3、查看剛剛創建的RC 
kubectl get rc

 
 
4、查看Pod的創建情況 
kubectl get pods

 
這里會出現的錯誤:
 
1)這里的status一直處於ContainerCreating狀態,可以通過查看狀態是什么問題 
kubectl describe pod mysql

 
 
 
 
可以看到這個文件不存在,下載安裝
 
 
 
 
1) wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm
2) rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv --to-stdout ./etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem

 

2)docker-runc沒有
 
 
 
 
ln -s  /usr/libexec/docker/docker-runc-current /usr/libexec/docker/docker-runc

 

解決完上面的兩個問題后,就可以看到status處於Running狀態了

 
5、通過docker ps -a可以看到有一個Mysql的容器啟動了 
 
 
6、創建一個與之關聯的Kubernetes Service,mysql-svc.yaml 
apiVersion: v1
kind: Service    #表明是Kubernetes Service
metadata:
  name: mysql    #Service的全局唯一名稱;Service 的服務名
spec:
  ports:
   - port: 3306  #Service提供服務的端口號
  selector:
   app: mysql    #service對應的Pod擁有這里定義的標簽; 確定了哪些Pod副本(實例)對應到本服務

 

7、創建Service對象 
kubectl create -f mysql-svc.yaml

 

8、查看剛剛創建的service 
kubectl get svc

 

 

這里Mysql服務被分配了一個值為10.254.243.27的Cluster IP地址,這是一個虛地址,隨后,Kubernetes集群中其他新創建的Pod就可以通過Service的Cluster IP + Port來連接和訪問了。
通常情況下,Cluster IP是在Service創建后又Kubernetes系統自動分配的,其他的Pod無法預先知道某個Service的Cluster IP地址,因此需要一個服務發現機制來找到這個服務。Kubernetes里,根據Service的唯一名字,容器可以從環境變量中獲取到Service對應的Cluster IP地址和端口,從而發起TCP/IP連接請求了。
 
 
三、啟動Tomcat應用
 
1、啟動Tomcat應用,創建對應的RC文件myweb-rc.yaml
 
apiVersion: v1
kind: ReplicationController
metadata:
  name: myweb
spec:
  replicas: 5
  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'

 

2、將tomcat發布到Kubernetes集群中 
kubectl create -f myweb-rc.yaml 
 
3、創建對應的Kubernetes Service 
apiVersion: v1
kind: Service
metadata: 
  name: myweb
spec:
  type: NodePort       #表明此Service開啟了NodePort方式的外網訪問模式
  ports:
    - port: 8080
      nodePort: 30001  #在集群之外,可以通過30001這個端口訪問myweb,對應到8080的虛端口上。
  selector:
    app: myweb

 

kubectl create -f myweb-svc.yaml 

  

四、訪問
 
1、通過瀏覽器訪問IP:PORT/demo/發現如下報錯: 
 
 
解決辦法:
 
在Tomcat的myweb-svc.yaml文件中設置變量的時候,要寫mysql集群的IP  
                  
 
 
 
2、改了yaml文件之后需要先刪掉原有的rc和pods  
kubectl delete rc myweb
kubectl delete pods --grace-period=0 --force --all
 
 
3、按照上面的創建步驟創建一遍,再測試就可以了  
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM