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