Kubenetes 權威指南 第一個小例子


為了避免遺忘,自己在學習k8s時,部署搭建第一個小例子,踩過的坑記錄一下

一、描述

創建一個簡單的Java web程序,此 Java Web 應用 的 結構 比較 簡單, 是一 個 運行 在 Tomcat 里 的 Web App, 如圖 1. 1 所示, JSP頁面通過 JDBC 直接訪問 MySQL 數據庫並展示數據。 為了演示和簡化的目的,只要程序正確連接到了數據庫上,它就會自動完成對應的 Table的創建與初始化數據的准備工作。所以,當我們通過瀏覽器訪問此應用的時候,就會顯示一個表格的頁面,數據則來自數據庫。
Java Web應用的架構組成
此應用需要啟動兩個容器:Web App容器和MySQL容器,並且Web App容器需要訪問MySQL容器。 在Docker 時代,假設我們在一個宿主機上啟動了這兩個容器,則我們需要把MySQL容器的 IP 地址通過環境變量的方式注入Web App容器里;同時,需要將 WebApp 容器的8080 端口映射到宿主機的8080端口,以便能在外部訪問。在本章的這個例子里,我們看看在Kubernetes 時代是如何完成這個目標的。

二、環境准備

1、關閉CentOS 自帶防火牆服務

  1.   # systemctl disable firewalld
  2.   # systemctl stop firewalld

2、安裝 etcd和Kubernetes軟件(會自動安裝Docker軟件)

# yum install -y etcd kubernetes

3、安裝好軟件后,修改兩個配置文件

Docker配置文件 /etc/sysconfig/docker,其中OPTIONS的內容設置為:

OPTIONS='--selinux-enabled=false --insecure-registry gcr.io'

Kubernets apiserver配置文件 /etc/kubernetes/apiserver,將 –adminssion_control參數中的ServiceAccount刪除

4、按順序啟動所有服務:

  1.  systemctl start etcd
  2.  systemctl start docker
  3.  systemctl start kube-apiserver
  4.  systemctl start kube-controller-manager
  5.  systemctl start kube-scheduler
  6.  systemctl start kubelet
  7.  systemctl start kube-proxy

5、Docker拉取mysql鏡像和tomcat鏡像

mysql鏡像

docker pull mysql:5.6

注意 這里 拉取的是 mysql:5.6   不可以是最新的版本,否則由於驅動的問題,會導致jdbc 數據庫連接錯誤。

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database 

tomcat鏡像

docker pull kubeguide/tomcat-app:v1

三、啟動MySql服務

1、首先為MySql服務創建一個RC定義文件:mysql-rc.yaml

apiVersion: v1
kind: ReplicationController
metadata:
  name: mysql
spec:
  replicas: 1
  selector:
    app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:5.6
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "123456"

2、發布到Kubernetes集群

1)、創建RC

# kubectl create -f mysql-rc.yaml

2)、驗證創建是否成功

kubectl get rc

rc創建沒成功

kubectl get pods

pods創建沒成功

* 沒創建成功 * 一直處於ContainerCreating

3)、查找kubernetes pod卡在ContainerCreating狀態原因並解決

主要是通過“kubectl describe pod PodName”指令查看pod發生的事件,從事件列表中可以查找到錯誤信息。

# kubectl describe pod mysql

錯誤信息

通過最后一行錯誤提示,下載鏡像超時,訪問地址被牆了

從國內鏡像下載pod-infrastructure,使用阿里鏡像服務,或者國內其它鏡像服務
下載地址 registry.cn-hangzhou.aliyuncs.com/sunyuki/pod-infrastructure,並且重新命名。 f66f4bd9b894 是我這里下載pod-infrastructure的imageId

  1.  
    # docker pull registry.cn-hangzhou.aliyuncs.com/sunyuki/pod-infrastructure
  2.  
    # docker tag f66f4bd9b894 registry.access.redhat.com/rhel7/pod-infrastructure:latest

刪除之前創建的rc,重新創建MySql Rc

  1.  
    # kubectl delete -f mysql-rc.yaml
  2.  
    # kubectl create -f mysql-rc.yaml

使用 # kubectl describe pod mysql 查看是否創建成功
這里寫圖片描述
通過docker ps指令查看正在運行的容器

# docker ps | grep mysql

這里寫圖片描述

四、構建Mysql Kubernetes Service定義文件

文件名為 mysql-scv.yaml

內容:

apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
    - port: 3306
  selector:
    app: mysql

 

1、創建Service

# kubectl create -f mysql-scv.yaml

2、查看創建的service

# kubectl get svc
  1.  
    [root@localhost test]# kubectl get svc
    NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE 
    kubernetes 10.254.0.1 <none> 443/TCP 1d
    mysql 10.254.138.253 <none> 3306/TCP 1m

注意到MySql服務被分配了一個值為10.254.138.253的ClusterIP地址,這是一個虛地址,隨后Kubernetes集群中其他新創建的Pod就可以通過Service的ClusterIP+端口號6379來連接和訪問它。根據Service的唯一名字,容器可以從環境變量中獲取到Service對應的ClusterIP地址和端口,從而發起TCP/IP連接請求了。

五、啟動Tomcat應用

上面我們定義和啟動了MySql服務,接下來我們采用同樣的步驟,完成Tomcat應用的啟動過程。

1、創建對應的RC文件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'

  

2、發布到Kubernetes集群

1)、創建RC

# kubectl create -f myweb-rc.yaml

2)、驗證創建是否成功

  1.  
    # kubectl get rc
  2.  
    # kubectl get pods

創建成功
這里寫圖片描述

六、構建Tomcat Kubernetes Service定義文件

文件名為 myweb-svc.yaml

內容:

apiVersion: v1
kind: Service
metadata:
  name: myweb
spec:
  type: NodePort
  ports:
    - port: 8080
      nodePort: 30001
  selector:
    app: myweb

  

1、創建Service

# kubectl create -f myweb-svc.yaml

2、查看創建的Service

# kubectl get svc
  1.  
    [root@localhost test]# kubectl get svc
    NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
    kubernetes 10.254.0.1 <none> 443/TCP 1d
    mysql 10.254.138.253 <none> 3306/TCP 34m
    myweb 10.254.29.1 <nodes> 8080:30001/TCP 1m

myweb可以通過30001這個端口訪問myweb(對應到8080的虛端口上)

七、通過瀏覽器訪問頁面

可以通過本機IP/127.0.0.1:30001打開tomcat頁面。

然鵝,我們使用127.0.0.1:30001/demo打開頁面提示jdbc數據庫連接錯誤。

  1.  
    [root@localhost ~] # kubectl get ep
    NAME ENDPOINTS AGE
    kubernetes 192.168.80.128:6443 9h
    mysql 172.17.0.7:3306 9h
    myweb 172.17.0.2:8080,172.17.0.3:8080,172.17.0.4:8080 + 2 more... 9h
  2. [root@localhost ~] # kubectl exec -ti myweb-qrjsd -- /bin/bash
  3.  root@myweb- qrjsd:/usr/local/tomcat# echo $MYSQL_SERVICE_HOST
  4. mysql
  5.  root@myweb- qrjsd:/usr/local/tomcat# echo "172.17.0.7 mysql" >> /etc/hosts
  6.  root@myweb- qrjsd:/usr/local/tomcat#

注意: mysql 對應的 ip 地址,大家電腦上的應該不一樣,根據 kubctl get ep 返回的 mysql ip信息來配置。 其實就是人肉把域名ip給加上去 

 

 

附錄 k8s 常用用法

kubectl get po   顯示所有的 pod, 准確的說是顯示 default 命名空間下的所有pod

kubectl get no   顯示所有的node

kubectl get svc

kubectl get rc

kubectl get svc

kubectl get po --all-namespaces   所有命名空間下的pod

kubectl get po -n kube-system   只顯示 kube-system 命名空間下的所有pod

kubectl describe no node-name  顯示node-name指定的 node 的詳細情況

kubectl describe po pod-name     顯示 pod-name 指定的 pod 的詳細情況 

describe 可以用於各種 k8s 資源, 比如 rc  ns  svc

 

轉載改編自:https://blog.csdn.net/wangjunsheng/article/details/85229581

 

 
        
 
 


免責聲明!

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



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