kubernetes視覺化搭建叢集,web介面一鍵操作
ku8eye web 開發環境
安裝部署的架構圖如下圖所示。
注:執行ku8eye-web開發環境的伺服器應在待安裝Kubernetes叢集的伺服器範圍之外,並能夠與待安裝伺服器網路連通。
檔名為:ku8eye-web.tar.gz 用gunzip解壓縮後,得到檔案ku8eye-web.tar
匯入docker映象:
# docker load -i ku8eye-web.tar
給該映象打上tag:
# docker tag 6f46b1372b52 ku8eye-web
執行開發環境: docker run -tid --name ku8eye-web -p 3306:3306 -p 8080:8080 -p 9001:9001 ku8eye-web
如需對映sshd的22埠,需新增一個 -p 引數,例如 -p 2222:22
容器啟動成功後,需等待15秒左右,等待mysql資料庫與web應用啟動完成。
ku8eye-web的使用方式:
1. 命令列方式
進入容器:docker exec -ti ku8eye-web bash
使用命令列完成一鍵安裝Kubernetes叢集,指令碼為:
/root/ku8eye-startup.sh $1 $2 $3
需要輸入的3個引數為:
$1: 待安裝主機IP地址列表,以逗號分隔。第一臺主機將作為Kubernetes Master。例如:192.168.1.2,192.168.1.3
$2: docker0的B類IP地址,系統自動為每臺主機設定docker0的C類地址,例如,輸入 172.0.0.0/16,在兩臺機器上將分別設定docker0的地址為 172.0.1.0/24 和 172.0.2.0/24
$3: root使用者的密碼,目前僅支援所有主機相同的密碼,例如:123456
一個完整的命令列如下: /root/ku8eye-startup.sh "192.168.1.2,192.168.1.3" "172.0.0.0/16" "123456"
注:每個引數需用雙引號引起來
然後即可觀察輸出結果。
2. 網頁方式
開啟瀏覽器,位址列輸入宿主機IP和8080埠,即可進入ku8eye-web頁面,對Kubernetes叢集進行操作了。
登入賬號:guest/123456
點選左側“K8s Cluster”選單,選擇“Cluster Inf”進行安裝。
---- 容器內包含的軟體 ----
1. Ansible安裝環境,以及安裝Kubernetes所需的全部軟體
Ansible的使用方法詳見下文“Ansible安裝Kubernetes叢集說明”
2. JRE1.8
環境變數 JAVA_HOME=/root/jre1.8.0_65
3. MySQL 5.7.9
資料庫名:ku8eye
資料庫使用者名稱:ku8eye,密碼:123456
4. ku8eye-web 應用
jar包:/root/ku8eye-web.jar
Dockerfile以及打包所需的檔案在以下目錄:
src\ku8eye-ansible
子目錄和檔案包括:
├─db_scripts
├─jre1.8.0_65 -- 需要自行補充二進位制檔案
├─kubernetes_cluster_setup
│ ├─group_vars
│ ├─pre-setup
│ │ └─multi-passworrd-sssh-key
│ └─roles
│ ├─docker-registry
│ │ ├─defaults
│ │ ├─files -- 需要自行補充二進位制檔案
│ │ ├─tasks
│ │ └─templates
│ ├─etcd
│ │ ├─defaults
│ │ ├─files -- 需要自行補充二進位制檔案
│ │ ├─tasks
│ │ └─templates
│ ├─kube-master
│ │ ├─defaults
│ │ ├─files -- 需要自行補充二進位制檔案
│ │ ├─tasks
│ │ └─templates
│ └─kube-node
│ ├─defaults
│ ├─files -- 需要自行補充二進位制檔案
│ ├─tasks
│ └─templates
└─shell_scripts
---- ku8eye-web映象的Dockerfile說明 ----
完整的Dockerfile:
FROM centos:latest
MAINTAINER [email protected]
# set timezone
ENV TZ Asia/Shanghai
# set http proxy if needed
# ENV http_proxy="http://<ip>:<port>" https_proxy="http://<ip>:<port>"
# 1. install ansible (from Internet)
RUN yum clean all && \
yum -y install epel-release && \
yum -y install PyYAML python-jinja2 python-httplib2 python-keyczar python-paramiko python-setuptools git python-pip
RUN mkdir /etc/ansible/ && echo -e '[local]\nlocalhost' > /etc/ansible/hosts
RUN pip install ansible
# 2. install sshpass, and generate ssh keys (from Internet)
RUN yum -y install sshpass
RUN ssh-keygen -q -t rsa -N "" -f ~/.ssh/id_rsa
# make ansible not do key checking from ~/.ssh/known_hosts file
ENV ANSIBLE_HOST_KEY_CHECKING false
# 3. install MariaDB (mysql) (from Internet)
COPY MariaDB.repo /etc/yum.repos.d/MariaDB.repo
RUN yum -y install MariaDB-server MariaDB-client
# 4. install supervisor (from Internet)
RUN pip install supervisor
# 5. add JRE1.8
COPY jre1.8.0_65 /root/jre1.8.0_65
ENV JAVA_HOME="/root/jre1.8.0_65" PATH="$PATH:/root/jre1.8.0_65/bin"
RUN chmod +x /root/jre1.8.0_65/bin/*
# 6. install openssh
RUN yum install -y openssh openssh-server
RUN mkdir -p /var/run/sshd && echo "root:root" | chpasswd
RUN /usr/sbin/sshd-keygen
RUN sed -ri 's/UsePAM yes/#UsePAM yes/g' /etc/ssh/sshd_config && sed -ri 's/#UsePAM no/UsePAM no/g' /etc/ssh/sshd_config
# 7. add ku8eye-ansible binary and config files
COPY kubernetes_cluster_setup /root/kubernetes_cluster_setup
# 8. copy shell scripts, SQL scripts, config files (could be updated in the future)
# db init SQL
COPY db_scripts /root/db_scripts
# shell scripts
COPY shell_scripts /root/shell_scripts
RUN chmod +x /root/shell_scripts/*.sh
COPY ku8eye-install-kubernetes.sh /root/ku8eye-install-kubernetes.sh
RUN chmod +x /root/ku8eye-install-kubernetes.sh
# latest jar
COPY ku8eye-web.jar /root/ku8eye-web.jar
# 9. start mariadb, init db data, and start ku8eye-web app
# supervisor config file
COPY supervisord.conf /etc/supervisord.conf
ENTRYPOINT /usr/bin/supervisord
基礎映象為CentOS官方docker映象:centos:latest
主要步驟:
注:
設定環境變數 ANSIBLE_HOST_KEY_CHECKING=false
表示ansible在ssh登入其他機器時,不執行基於known_hosts檔案的 key checking 操作,這樣能夠跳過首次ssh連線需要輸入yes的操作。
2. 為ansible安裝 sshpass,並執行 ssh-keygen
生成金鑰
3. 新增MariaDB.repo yum源配置,執行yum安裝MariaDB-Server
MariaDB.repo配置如下:(根據MariaDB的更新,需要手工修改baseurl地址
)
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.1/centos7-amd64/
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=0
4. 安裝 supervisor (pip install)
5. 複製 JRE1.8 到容器的 /root/jre1.8.0_65
目錄,並設定環境變數 JAVA_HOME 和 PATH
6. 安裝openssh
7. 複製安裝Kubernetes所需的所有檔案和ansible配置指令碼到目錄 /root/kubernetes_cluster_setup
8. 複製啟動指令碼、SQL指令碼、配置檔案到容器的 /root
目錄
9. 複製配置檔案 supervisord.conf 到容器的 /etc
目錄
supervisord.conf檔案內容如下:
其中,設定nodaemon為true 表示 supervisord 將在前臺執行
通過supervisor將啟動兩個程式:sshd
和 指令碼run.sh
[supervisord]
nodaemon = true
[program:sshd]
command = /usr/sbin/sshd -D
autostart = true
autorestart = false
redirect_stderr = true
[program:ku8eye-web]
command = /root/shell_scripts/run.sh
autostart = true
autorestart = false
redirect_stderr = true
其中,/root/run.sh檔案的內容包括啟動mysql服務,建立ku8eye資料庫,初始化資料,最後啟動tomcat,內容為:
#!/bin/sh
# start mysqld service
/root/shell_scripts/run_mysqld.sh
# wait for mysqld to startup completely
sleep 5
echo "======`date +"[%Y-%m-%d %H:%M:%S]"` mysqld_safe start done. ======"
# run ku8eye-web initsql.sql to create user and tables
mysql < /root/db_scripts/initsql.sql
echo "======`date +"[%Y-%m-%d %H:%M:%S]"` create mysql tables for ku8eye-web done. ======"
sleep 1
# start ku8eye-web app
/root/shell_scripts/run_tomcat.sh
echo "======`date +"[%Y-%m-%d %H:%M:%S]"` start ku8eye-web done. ======"
run_mysqld.sh指令碼的內容為:
nohup mysqld_safe &
run_tomcat.sh指令碼的內容為:
nohup $JAVA_HOME/bin/java -jar /root/ku8eye-web.jar org.ku8eye.App > /root/tomcat.log 2>&1 &
最後,設定啟動命令為 /usr/bin/supervisord
執行docker build完成映象的建立
# docker build -t="ku8eye-web" --rm .
---- Ansible安裝Kubernetes叢集說明 ----
Ansible是一款基於Python開發的自動化運維工具,ku8eye-web通過呼叫 ansible-playbook 完成Kubernetes叢集的一鍵安裝。
1. Ansible 安裝環境準備
1.1. 準備一臺Linux伺服器,安裝docker。
1.2. 下載ku8eye web開發環境 docker映象並啟動容器(見本文開始章節的說明)。
2. Kubernetes叢集環境準備
一個Kubernetes叢集由etcd服務、master服務和一組node組成。 在無法訪問Internet的環境,還需一臺伺服器作為docker private registry 私庫,供Kubernetes使用。 本文以4臺伺服器為例,第一臺安裝docker registry,第二臺安裝etcd和master的服務,最後兩臺安裝node所需服務。
系統要求: CentOS 7(RedHat 7)及以上版本,Linux 核心 3.10 及以上版本。 Kubernetes:推薦 v1.1 及以上版本 etcd:推薦v2.2 及以上版本 Docker:推薦 v1.9.0 及以上版本
伺服器IP地址 | 作用 |
---|---|
192.168.1.200 | docker-registry |
192.168.1.201 | etcd |
192.168.1.201 | kube-master |
192.168.1.202 | kube-node |
192.168.1.203 | kube-node |
注1:根據實際環境進行修改 注2:請勿將執行ansible的伺服器納入Kubernetes叢集內。
3. Kubernetes叢集安裝前的準備工作
3.1 啟動容器,進入容器
$ docker run -tid --name ku8eye-web -p 3306:3306 -p 8080:8080 -p 9001:9001 ku8eye-web
$ docker exec -ti ku8eye-web bash
注:不進入容器,在安裝伺服器直接使用 docker exec 也可以完成ansible-playbook指令碼的執行,注意配置檔案需要使用全路徑: $ docker exec -ti ku8eye-web ansible-playbook -i /root/kubernetes_cluster_setup/hosts /root/kubernetes_cluster_setup/pre-setup/ping.yml
3.2 修改 ansible 的 hosts 配置檔案
修改/root/kubernetes_cluster_setup/hosts檔案,內容為待安裝Kubernetes叢集各伺服器的分組與IP地址。
注:通過修改hosts檔案可以選擇安裝哪些role到哪些主機上。 每臺伺服器的使用者名稱和密碼分別設定
[docker-registry]
192.168.1.200 ansible_ssh_user=root ansible_ssh_pass=123456
[etcd]
192.168.1.201 ansible_ssh_user=root ansible_ssh_pass=123456
[kube-master]
192.168.1.201 ansible_ssh_user=root ansible_ssh_pass=123456
[kube-node]
192.168.1.202 ansible_ssh_user=root ansible_ssh_pass=123456
192.168.1.203 ansible_ssh_user=root ansible_ssh_pass=123456
3.4 執行ansible-playbook命令完成複製公鑰操作:
$ ansible-playbook -i hosts pre-setup/keys.yml
PLAY ***************************************************************************
TASK [setup] *******************************************************************
ok: [192.168.1.200]
ok: [192.168.1.201]
ok: [192.168.1.202]
ok: [192.168.1.203]
TASK [Push rsa public key to all machines] *************************************
ok: [192.168.1.200]
ok: [192.168.1.201]
ok: [192.168.1.202]
ok: [192.168.1.203]
PLAY RECAP *********************************************************************
192.168.1.200 : ok=2 changed=0 unreachable=0 failed=0
192.168.1.201 : ok=2 changed=0 unreachable=0 failed=0
192.168.1.202 : ok=2 changed=0 unreachable=0 failed=0
192.168.1.203 : ok=2 changed=0 unreachable=0 failed=0
keys.yml檔案內容如下:
# Using this module REQUIRES the sshpass package to be installed!
#
# This REQUIRES you have created a ~/.ssh/id_rsa.pub public key
#
# Place the root password for all nodes in ~/rootpassword, run this playbook,
# and it will put your public key on all the nodes. Then delete rootpassword!
#
# You can also comment out the "vars" section and use --ask-pass on the command
# line.
#
# All ansible modules will fail if the host is not in the ssh known_hosts.
# Normally ansible just asks if the host key is acceptable. BUT when using
# password instead of public key authentication it will not ask and will instead
# fail.
#
# You can solve this by running a meaningless play to first get the ssh host
# key, then lay down the public key. Something like:
# ansible-playbook -i inventory ping.yml
# Then answer yes as you check the host keys.
#
# You also could set the environment variable ANSIBLE_HOST_KEY_CHECKING=False
# when running this playbook. You would have to answer the host key questions
# the next time you run ansible.
#
---
- hosts: all
tasks:
- name: Push rsa public key to all machines
authorized_key: user={{ ansible_ssh_user }} key="{{ lookup('file', '~/.ssh/id_rsa.pub') }}"
3.5 執行ansible-playbook命令停止所有機器的防火牆服務:
$ ansible-playbook -i hosts pre-setup/disablefirewalld.yml
PLAY ***************************************************************************
TASK [setup] *******************************************************************
ok: [192.168.1.200]
ok: [192.168.1.201]
ok: [192.168.1.202]
ok: [192.168.1.203]
TASK [stop firewalld service] **************************************************
changed: [192.168.1.200]
changed: [192.168.1.201]
changed: [192.168.1.202]
changed: [192.168.1.203]
TASK [disable firewalld service] ***********************************************
changed: [192.168.1.200]
changed: [192.168.1.201]
changed: [192.168.1.202]
changed: [192.168.1.203]
PLAY RECAP *********************************************************************
192.168.1.200 : ok=2 changed=0 unreachable=0 failed=0
192.168.1.201 : ok=3 changed=2 unreachable=0 failed=0
192.168.1.202 : ok=3 changed=2 unreachable=0 failed=0
192.168.1.203 : ok=3 changed=2 unreachable=0 failed=0
disablefirewalld.yml檔案內容如下:
---
- hosts: all
tasks:
- name: stop firewalld service
command: systemctl stop firewalld
- name: disable firewalld service
command: systemctl disable firewalld
3.6 執行ansible-playbook命令為每臺伺服器新增docker registry伺服器主機名與IP地址的host記錄
注:本文中安裝的docker registry將使用主機名作為私庫的地址,如果希望使用IP地址,請修改相應的配置檔案
# ansible-playbook -i hosts pre-setup/add_docker_registry_host.yml
PLAY ***************************************************************************
TASK [setup] *******************************************************************
ok: [192.168.1.200]
ok: [192.168.1.201]
ok: [192.168.1.202]
ok: [192.168.1.203]
TASK [add host entry for docker private registry server] ***********************
changed: [192.168.1.200]
changed: [192.168.1.201]
changed: [192.168.1.202]
changed: [192.168.1.203]
PLAY RECAP *********************************************************************
192.168.1.200 : ok=2 changed=1 unreachable=0 failed=0
192.168.1.201 : ok=2 changed=1 unreachable=0 failed=0
192.168.1.202 : ok=2 changed=1 unreachable=0 failed=0
192.168.1.203 : ok=2 changed=1 unreachable=0 failed=0
add_docker_registry_host.yml檔案內容如下:
---
- hosts: all
tasks:
- name: add host entry for docker private registry server
shell: echo {{docker_registry_server_ip}} {{docker_registry_server_name}} >> /etc/hosts
其中引數 {{docker_registry_server_ip}} {{docker_registry_server_name}} 在 group_vars/all.yml
檔案中進行配置。
4. Kubernetes叢集安裝
注:在 ku8eye-web 映象中已建立好全部目錄和檔案,僅需修改配置檔案的內容(詳見 [4.6 修改配置檔案的內容](#4.6 修改配置檔案的內容) 一節的說明)
4.1 建立Role
在安裝伺服器的/root/kubernetes_cluster_setup目錄下為不同的分組建立role(角色),包括:
- docker-registry
- etcd
- kube-master
- kube-node
4.2 在每個role下建立4個子目錄:
defaults:存放變數的值,目錄下main.yml檔案將被ansible預設讀取 files:存放需安裝(複製)的原始檔 tasks:ansible-playbook執行的任務指令碼,目錄下main.yml檔案將被ansible預設讀取 templates:需修改引數的配置檔案,其中引數由defaults目錄中的值進行替換
4.3 在安裝伺服器的/root/kubernetes_cluster_setup目錄中建立group_vars子目錄存放全域性變數
預設檔案為all.yml
4.4 在安裝伺服器的/root/kubernetes_cluster_setup目錄中建立setup.yml檔案,內容為ansible-playbook在各host安裝role的配置:
---
- hosts: docker-registry
roles:
- docker-registry
- hosts: etcd
roles:
- etcd
- hosts: kube-master
roles:
- kube-master
- hosts: kube-node
roles:
- kube-node
4.5 準備最新版本的二進位制檔案
所需修改的二進位制檔案列表:
kubernetes_cluster_setup
│
└─roles
├─docker-registry
│ └─files
│ docker docker主程式
│ docker-registry.tar docker registry 映象檔案
│ kubernetes_pause.tar Kubernetes pause 映象檔案
│
├─etcd
│ └─files
│ etcd etcd主程式
│ etcdctl etcdctl命令列工具
│
├─kube-master
│ └─files
│ hyperkube Kubernetes相關檔案
│ kube-apiserver
│ kube-controller-manager
│ kube-scheduler
│ kubectl
│
└─kube-node
└─files
docker docker主程式
georce_route_quagga.tar quaggar docker 映象檔案
hyperkube Kubernetes相關檔案
kube-proxy
kubectl
kubelet
說明:
- docker registry 映象下載地址:docker pull registry:2 -- 匯出映象檔案:docker save -o docker-registry.tar registry:2
- Kubernetes pause 映象下載地址:docker pull gcr.io/google_containers/pause -- 匯出映象檔案:docker save -o kubernetes_pause.tar gcr.io/google_containers/pause
- Quagga 映象檔案下載地址:docker pull index.alauda.cn/georce/router -- 匯出映象檔案:docker save -o georce_route_quagga.tar index.alauda.cn/georce/router
4.6 修改配置檔案的內容
安裝Kubernetes叢集所需修改的配置檔案列表如下:
kubernetes_cluster_setup
│
├─hosts 主機列表、各主機個性化引數
│
├─group_vars
│ all.yml 全域性引數
│
└─roles
├─docker-registry
│ └─defaults
│ main.yml docker registry相關引數
│
├─etcd
│ └─defaults
│ main.yml etcd相關引數
│
├─kube-master
│ └─defaults
│ main.yml master相關引數
│
└─kube-node
└─defaults
main.yml node相關引數
特別說明: 需要仔細規劃以下兩組IP地址範圍,它們都不能與物理機的IP地址範圍重疊: a. 各主機上docker0網橋的IP地址。b. Kubernetes中Service的 Cluster IP地址範圍。
1) 全域性引數 group_vars\all.yml
cluster_domain_name: cluster.local
kube-dns服務設定的domain名cluster_dns_ip: 20.1.0.100
kube-dns服務IP地址(需在kube-apiserver的apiserver_service_cluster_ip_range範圍內)docker_registry_server_name: yourcompany.com
docker registry 主機名docker_registry_server_ip: 192.168.1.202
docker registry 主機IP地址push_pause_image: true
是否將 Kubernetes pause 映象push到 docker registrykubernetes_pause_image_id: 6c4579af347b
pause映象IDkubernetes_pause_image_tag: "{{docker_registry_url}}/google_containers/pause"
pause映象在 docker registry 的URL
2) docker registry 相關引數 roles\docker-registry\defaults\main.yml
docker0_ip: 172.17.253.1/24
docker0網橋的IP地址docker_runtime_root_dir: /hadoop1/docker
docker執行根目錄docker_registry_url: "{{docker_registry_server_name}}:5000"
docker registry URLdocker_registry_root_dir: /hadoop1/docker_registry
docker registry 執行目錄docker_registry_image_id: 774242a00f13
docker registry 映象IDdocker_registry_image_tag: registry:2.2.0
docker registry 映象tag
3) etcd相關引數 roles\etcd\defaults\main.yml
peer_ip: 192.168.1.201
etcd所在主機的IP地址(cluster配置時使用)etcd_data_dir: /var/lib/etcd/etcd_data
etcd資料儲存目錄
4) master相關引數 roles\kube-master\defaults\main.yml
-- for kube-apiserver
etcd_servers: http://192.168.1.201:4001
kube-apiserver所需etcd服務的URLapiserver_insecure_port: 1100
kube-apiserver監聽的非安全埠號apiserver_service_cluster_ip_range: 20.1.0.0/16
Kubernetes Services可分配IP地址池apiserver_service_node_port_range: 1000-5000
NodePort 型別的 Service 可用埠範圍,含兩端
-- for kube-controller-manager, kube-scheduler
kube_master_url: http://192.168.1.201:1100
kube-apiserver服務URLkube_node_sync_period: 10s
master與node資訊同步時間間隔
-- to generate ssh keys on master server
ca_crt_CN: ecip.hp.com
master ssh key內CA證書中CN引數server_key_CN: 192.168.1.201
master ssh key內CN引數
5) node相關引數 roles\kube-node\defaults\main.yml
-- for kubelet, kube-proxy
kube_master_url: http://192.168.1.201:1100
kube-apiserver服務URL
-- quagga router docker image info
quagga_router_image_id: f96cfe685533
quagga router 映象IDquagga_router_i