K8S demo

轉自:https://blog.csdn.net/hahaxu/article/details/79772296

kubernetes 從一個簡單例子開始

參考 《kubernetes 權威指南》一節的 從一個簡單例子開始,操作實錄。

一、描述

創建一個簡單的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 自帶防火牆服務

# systemctl disable firewalld
# 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、按順序啓動所有服務:

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

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

docker pull daocloud.io/library/mysql:5.6

注意不要用 mysql:latest,因爲最新版是 8.0,於本 demo 驅動問題,連不上數據庫。不能超過 5.6。(5.7 也不行)

因爲牆的問題,從 daocloud.io 而不是 docker.io 拉取,否則超級慢而且失敗。

rc 在創建mysql時,默認從 docker.io/mysql 拉取,由於牆的原因,創建 rc 會失敗。從 daocloud.io/library/mysql:5.6 拉取後需要創建個別名,3ed1080b793f 是我本地mysql的imageId

docker images  查看本機所有 docker 鏡像。

docker tag 3ed1080b793f docker.io/library/mysql:5.6

創建別名後:

[root@iZbp19qi8t0tvh2myvul3zZ kube_test]# docker images | grep mysql
docker.io/mysql                                                5.6                 3ed1080b793f        7 months ago        256 MB
daocloud.io/library/mysql                                 5.6                 3ed1080b793f        7 months ago        256 MB

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
        ports:
        - containerPort: 3306
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: "123456"

2、發佈到Kubernetes集羣

1)、創建RC

kubectl create -f mysql-rc.yaml

2)、驗證創建是否成功

kubectl get rc

kubectl get pods

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

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

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

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

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

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

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

kubectl delete -f mysql-rc.yaml
kubectl create -f mysql-rc.yaml

使用 # kubectl describe pod mysql 查看是否創建成功

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

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

五、啓動Tomcat應用

1、創建對應的RC文件myweb-rc.yaml

kind: ReplicationController
metadata:
  name: myweb
spec:
# Pod的數量
  replicas: 1
# spec.selector與spec.template.metadata.labels,這兩個字段必須相同,否則下一步創建RC會失敗。
  selector:
    app: myweb
  template:
    metadata:
      labels:
        app: myweb
#   容器組的定義
    spec:
      containers:
#       容器名稱
        - name: myweb
#         容器對應的鏡像
          image: kubeguide/tomcat-app:v1
          ports:
#         在8080端口上啓動容器進程,PodIP與容器端口組成Endpoint,代表着一個服務進程對外通信的地址
          - containerPort: 8080
          env:
#此處如果在未安裝域名解析的情況下,會無法將mysql對應的IP解析到env環境變量中,因此先註釋掉!
#          - name: MYSQL_SERVICE_HOST
#            value: 'mysql'
          - name: MYSQL_SERVICE_PORT
            value: '3306'

2、發佈到Kubernetes集羣

1)、創建RC

kubectl create -f myweb-rc.yaml

2)、驗證創建是否成功

kubectl get rc
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

3、訪問

curl 127.0.0.1:30001/demo/

發佈了40 篇原創文章 · 獲贊 1 · 訪問量 3411
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章