1. 程式人生 > >kubernetes視覺化搭建叢集,web介面一鍵操作

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

 其中 3306 為mysql服務埠,8080 為tomcat服務埠,9001 為supervisor服務埠,均對映到宿主機上。

如需對映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.200docker-registry
192.168.1.201etcd
192.168.1.201kube-master
192.168.1.202kube-node
192.168.1.203kube-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 registry

  • kubernetes_pause_image_id: 6c4579af347b pause映象ID

  • kubernetes_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 URL

  • docker_registry_root_dir: /hadoop1/docker_registry docker registry 執行目錄

  • docker_registry_image_id: 774242a00f13 docker registry 映象ID

  • docker_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服務的URL
  • apiserver_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服務URL
  • kube_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 映象ID
  • quagga_router_i