5 months ago

kubespray 是一個用 ansible 幫你自動化安裝 kubernetes cluster 工具
這邊紀錄如何安裝一個完整的 kubernetes cluster

準備機器

我用虛擬機來實驗,網卡部分則是使用 一張 bridge 網卡,先簡化環境,免得有多網卡還要做額外設定
OS 是 CentOS-7-x86_64-Everything-1611 來安裝

記憶體部分除了 Master 要給 2G Ram,不然你 Master 服務一定開不起來,其他的給 1G 就可以了

Host IP
Ansible 192.168.31.109
Master 192.168.31.180
Node1 192.168.31.147
Node2 192.168.31.184

所有的機器安裝好後執行

更新

yum update -y

關閉SELINUX

關閉方式有兩個

立即生效,重開機後恢復

setenforce 0

永久性修改(要重啟機器) 由enforcing改成disabled

vim /etc/selinux/config  

SELINUX=disabled

reboot

檢查是否修改正確

getenforce

關閉防火牆

停止後 再 完全停用(重開機也不會啟動)

systemctl stop firewalld && systemctl disable firewalld

Ansible 操作機 準備

免密碼登入各台

cat << 'EOF' >> /etc/hosts
192.168.31.180 master
192.168.31.147 node1
192.168.31.184 node2
EOF

ssh-keygen
ssh-copy-id root@master
ssh-copy-id root@node1
ssh-copy-id root@node2

之後測試 ssh 到每一台,順便做以下動作

確認關閉SELINUX

setenforce 0

確認 DNS 名稱解析

[root@master ~]# ping google.com
PING google.com (216.58.200.46) 56(84) bytes of data.
64 bytes from tsa01s08-in-f14.1e100.net (216.58.200.46): icmp_seq=1 ttl=53 time=3.67 ms
64 bytes from tsa01s08-in-f14.1e100.net (216.58.200.46): icmp_seq=2 ttl=53 time=3.21 ms

如果沒有,則做以下動作

立即覆蓋設定(機器重啟後會被覆蓋掉)

echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf

加在網卡上 重啟後會被寫入 /etc/resolv.conf

cat << 'EOF' >> /etc/sysconfig/network-scripts/ifcfg-enp0s3
DNS1=8.8.8.8
DNS2=8.8.4.4
EOF

安裝 Ansible 跟依賴

yum install -y epel-release
yum install -y python-pip python-netaddr ansible git
pip install --upgrade pip
pip install --upgrade Jinja2

下載 kubespray

git clone https://github.com/kubernetes-incubator/kubespray
cd kubespray

編寫主機配置檔

cat << 'EOF' > ./inventory/inventory.cfg
[all]
master1  ansible_host=192.168.31.180 ansible_user=root ip=192.168.31.180
node1    ansible_host=192.168.31.147 ansible_user=root ip=192.168.31.147
node2    ansible_host=192.168.31.184 ansible_user=root ip=192.168.31.184

[kube-master]
master1

[kube-node]
node1
node2

[etcd]
master1

[k8s-cluster:children]
kube-node
kube-master
EOF
名稱 默認值 定義說明
ansible_host 主機名稱 SSH目的主機名稱或IP
ansible_user root SSH登录用户名

ref:http://www.yyang.org/ansible/Inventory.html

開啟使用模組 (非必須) 待驗證

vi inventory/group_vars/all.yml
# 改為 true

kubelet_load_modules: false

ref:https://github.com/kubernetes-incubator/kubespray/blob/master/inventory/group_vars/all.yml

開始安裝 Kubernetes

ansible-playbook -u centos -b -i inventory/inventory.cfg cluster.yml

到這邊已經可以安裝完成了

切換到 master 上確認節點狀況

ssh master
kubectl get nodes

取得所有的Pod(這邊有包含 NAMESPACE 是 kube-system 的,如果刪了,你重灌比較快)

kubectl get pods --all-namespaces

安裝 Dashboard UI

用 kubespray 安裝應該會自己幫你裝上 Dashboard

kubectl describe services kubernetes-dashboard --namespace=kube-system

如果沒有安裝的話自己安裝

kubectl create -f https://rawgit.com/kubernetes/dashboard/master/src/deploy/kubernetes-dashboard.yaml

Dashboard 預設是不會對外暴露的,可以用本機轉送

kubectl proxy --address 0.0.0.0 --accept-hosts '.*'

要加上 address 跟 accept-hosts 不然會出現

Unauthorized

我是在 master 上開 proxy 的,所以打開瀏覽器 http://192.168.31.180:8001/ui

ref:https://github.com/kubernetes/dashboard#kubernetes-dashboard

測試佈署一個 Nginx (關於Pod的一些基本指令)

可以邊測試邊看 Dashboard

ref:Run a Stateless Application Using a Deployment - Kubernetes

佈署一個 Nginx pod

kubectl create -f https://k8s.io/docs/tasks/run-application/deployment.yaml

檢視 Nginx 描述

kubectl describe deployment nginx-deployment

取得運行中關於 nginx 的 pod 資訊

kubectl get pods -l app=nginx

顯示 pod 資訊

kubectl describe pod <pod-name>

刪除

kubectl delete deployment nginx-deployment

佈署對外服務的 Nginx

Pod 不會直接對外服務,你要對外暴露需要 service 來接收外面的請求再轉送到 pod 處理

建立佈署

cat << EOF > nginx.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
        resources:
          requests:
            cpu: 400m
EOF
kubectl create -f nginx.yaml --record

上面我們佈署了兩份 nginx

cat << EOF > nginx-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
    nodePort: 30088
EOF
kubectl create -f nginx-svc.yaml

上面我們建立了服務,服務轉送對象為 labels 的 nginx
我們在每一台 Node 上暴露 30088 port 來做為接收的入口

上面執行完成後,你可以在每一台 http://nodeip:30088 看到你的 Nginx

建立自己做的 springboot image

cat << EOF > test-rest.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: test-rest-deployment
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: test-rest
    spec:
      containers:
      - name: test-rest
        image: spike234/test-rest:0.1.8
        ports:
        - containerPort: 8080
        resources:
          requests:
            cpu: 100m
EOF

kubectl apply -f test-rest.yaml --record

建立對外服務

cat << EOF > test-rest-svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: test-rest
  labels:
    app: test-rest
spec:
  type: NodePort
  selector:
    app: test-rest
  ports:
  - port: 8080
    targetPort: 8080
    nodePort: 30080
EOF

kubectl apply -f test-rest-svc.yaml --record

如何增加節點還沒有實驗,不過我原本的 inventory.cfg 增加一個 Node 再執行,已經裝好的服務就不會動也不會停,新的 node 也可以加進去,有時間再試驗一下
https://github.com/kubernetes-incubator/kubespray/blob/master/docs/getting-started.md#adding-nodes

Reference:
使用kargo快速自动化搭建kubernetes集群 - 汪云飞记录本
轻松了解Kubernetes部署功能 | 懒程序员改变世界
在Centos7上部署kubernetes集群 · Issue #28 · qianlei90/Blog
kubespray (kargo) 搭建 Kubernetes 集群环境 - 浩子
opsnull/follow-me-install-kubernetes-cluster: 和我一步步部署 kubernetes 集群
Installing Kubernetes On-premises/Cloud Providers with Kubespray - Kubernetes

找到其他有意思的資料
Kubespray で OpenStack 上に Kubernetes クラスタをデプロイする

rootsongjc/kubernetes-handbook: Kubernetes中文指南/实践手册 https://jimmysong.io/kubernetes-handbook

← Event Sourcing & CQRS Test CircleCI 2.0 SpringBoot config.yml →
 
comments powered by Disqus