轉自:https://blog.csdn.net/hahaxu/article/details/79772296
kubernetes 從一個簡單例子開始
參考 《kubernetes 權威指南》一節的 從一個簡單例子開始,操作實錄。
一、描述
創建一個簡單的Java web程序,此 Java Web 應用 的 結構 比較 簡單, 是一 個 運行 在 Tomcat 裏 的 Web App, 如圖 1. 1 所示, JSP頁面通過 JDBC 直接訪問 MySQL 數據庫並展示數據。 爲了演示和簡化的目的,只要程序正確連接到了數據庫上,它就會自動完成對應的 Table的創建與初始化數據的準備工作。所以,當我們通過瀏覽器訪問此應用的時候,就會顯示一個表格的頁面,數據則來自數據庫。
此應用需要啓動兩個容器: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/