Cloud

Launch a Kuryr-support cluster with Devstack and Kubeadm

Be aware that the following instructions may need to be modified to work well. Please see Devstack trouble shooting to get more details.

本篇大部分啟發自利用 Kuryr 整合 OpenStack 與 Kubernetes 網路
只是這篇有點舊,加上Kubespray在我使用的當下有一點bug
所以改用Kubeadm更快速輕量的進行集群部署

IP Role
192.168.0.6 Controller, k8s-master
192.168.0.17 Compute, k8s-node1

部署Controller / Master

部署Devstack

我有試著用packstack,不過他多節點安裝好像有點問題
之後會研究看看openstack-ansible

# 先更新
yum update -y

# 建立stack user
useradd -s /bin/bash -d /opt/stack -m stack
echo "stack ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers

# 切換到stack user
su - stack

# 安裝git
sudo yum install git -y

# 取得devstack
git clone https://git.openstack.org/openstack-dev/devstack
cd devstack

然後建立local.conf

[[local|localrc]]
HOST_IP=192.168.0.6
FLAT_INTERFACE=eth0
FIXED_RANGE=10.4.128.0/20
FIXED_NETWORK_SIZE=4096
FLOATING_RANGE=192.168.42.128/25
MULTI_HOST=1

LOGFILE=/opt/stack/logs/stack.sh.log
ADMIN_PASSWORD=labstack
DATABASE_PASSWORD=supersecret
RABBIT_PASSWORD=supersecret
SERVICE_PASSWORD=supersecret

# Services
ENABLED_SERVICES=rabbit,mysql,key

#Neutron Services
ENABLED_SERVICES+=,neutron,q-svc,q-agt,q-dhcp,q-l3,q-meta,q-lbaas

#Horizon Services
ENABLED_SERVICES+=,horizon

安裝pip, setuptools

curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
sudo python get-pip.py
sudo pip install -U pip setuptools

開始部署

./stack.sh

部署過程中有可能會斷線,如果用ssh會讓安裝程序中斷
可以用screen讓stack.sh保持運行

配置kuryr網路

在開始配置網路之前,要確認MTU設定是否正確。
Kuryr對MTU幾乎不做檢查!所以要在網路節點上調整Neutron的MTU設定
/etc/neutron/neutron.conf中,將global_physnet_mtu調到不大於對外網路界面MTU的數值
然後重新啟動neutron

systemctl restart devstack@q*

這邊可以用cli或horizon來做,所以我用文字敘述

  • 建立一個k8s project,接下來所有動作都在這個project中進行
  • 建立一個k8s user,讓他成為k8s project的member
  • 建立一個pod network,還有他的子網路
    kuryr給的建議是10.1.0.0/16,閘道10.1.255.254
  • 建立一個serivce network,還有他的子網路
    kuryr給的建議是10.2.0.0/16,閘道10.2.255.254
    pool只給10.2.128.1~10.2.255.253,前半留給load-balancer
  • 建立一個router,把pod和service的subnet的gateway都接上來
  • 建立一個security group,允許來自pod network和service network的所有TCP

安裝Kubeadm

# 安裝docker
yum install -y docker
systemctl enable docker && systemctl start docker

# 安裝kubeadm, kubelet, kubectl
cat < /etc/yum.repos.d/kubernetes.repo
[kubernetes]
cat < /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF
setenforce 0
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet && systemctl start kubelet

# 確保流量經過iptables
cat <  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

部署kubeadm

# 建立k8s cluster (依建立的cidr填寫)
# 這邊會輸出等等要用的join指令,可以複製起來
kubeadm init --pod-network-cidr=10.1.0.0/16 --service-cidr=10.2.0.0/16

# 複製kubectl config讓當前user使用
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

# 下載flannel檔案,也可以依自己偏好使用其他network plugin
# 反正等等都會被換成Kuryr,只是kubeadm目前只能這樣部署
curl -LO https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml

# 把kube-flannel.yml裡面的10.244.0.0/16取代成10.1.0.0/16

# 啟動flannel
kubectl apply -f kube-flannel.yml

# 執行proxy
screen -dm kubectl proxy --port=8080 --accept-hosts='.*' --address='0.0.0.0'

部署Kuryr-kubernetes

安裝套件

mkdir kuryr-k8s-controller
cd kuryr-k8s-controller
virtualenv env
git clone http://git.openstack.org/openstack/kuryr-kubernetes
. env/bin/activate
pip install -e kuryr-kubernetes

建立配置文件/etc/kuryr/kuryr.conf

[DEFAULT]
use_stderr = true
# 通常是 /usr/local/libexec/kuryr
bindir = {path_to_env}/libexec/kuryr
# 官方沒有給這一項設定,但是我運行的時候被要求設定這一項
# 有遇到可以把註解移掉
# lock_path=

[kubernetes]
# 因為是同一個節點,填現在的IP
api_root = http://{ip_of_kubernetes_apiserver}:8080

[neutron]
# 官方給http://127.0.0.1:35357/v3/,不過我只能用http://127.0.0.1/identity
auth_url = http://127.0.0.1/identity
# 這邊應該是k8s而非admin
username = admin
user_domain_name = Default
# 你給k8s user的密碼
password = ADMIN_PASSWORD
# 剛剛配置給k8s的project,直接用service其實也可
project_name = service
project_domain_name = Default
auth_type = password

[neutron_defaults]
ovs_bridge = br-int
# 這邊把剛剛建立的幾個物件的id填進去
pod_security_groups = {id_of_secuirity_group_for_pods}
pod_subnet = {id_of_subnet_for_pods}
project = {id_of_project}
service_subnet = {id_of_subnet_for_k8s_services}

確認一下有沒有在跑,他會一直監視,所以看沒有錯誤訊息就可以Ctrl+C

kuryr-k8s-controller --config-file /etc/kuryr/kuryr.conf -d

沒問題的話可以放進screen背景執行

screen -dm kuryr-k8s-controller --config-file /etc/kuryr/kuryr.conf -d

部署CNI-daemon

如果Master節點也要跑pod的話,就要執行此步驟

# 先讓master節點也可以運行pod
kubectl taint nodes --all node-role.kubernetes.io/master-

# 配置cni文件
# 剛剛已經把flannel掛上去了,所以/opt/cni/bin多半已經存在
mkdir -p /opt/cni/bin
ln -s $(which kuryr-cni) /opt/cni/bin/

然後建立一個/etc/cni/net.d/10-kuryr.conf文件
這邊要注意到,kubernetes只會讀取/etc/cni/net.d/中的第一個檔案
剛剛的flannel也會在裡面,kuryr很可能不會被讀進去
所以建立完文件之後,要把flannel的檔名改掉,讓他變成不是第一個

{
"cniVersion": "0.3.0",
"name": "kuryr",
"type": "kuryr-cni",
"kuryr_conf": "/etc/kuryr/kuryr.conf",
"debug": true
}

安裝相依套件

#不確定這個deactivate的意義為何
deactivate
sudo pip install 'oslo.privsep>=1.20.0' 'os-vif>=1.5.0'
. env/bin/activate

一樣,確定執行沒問題

kuryr-daemon --config-file /etc/kuryr/kuryr.conf -d

放進去screen跑

screen -dm kuryr-daemon --config-file /etc/kuryr/kuryr.conf -d

部署Compute / Worker

部署Devstack

步驟差不多,local.conf的配置不一樣而已

[[local|localrc]]
HOST_IP=192.168.0.11 # change this per compute node
FLAT_INTERFACE=eth0
MULTI_HOST=1
LOGFILE=/opt/stack/logs/stack.sh.log
ADMIN_PASSWORD=labstack
DATABASE_PASSWORD=supersecret
RABBIT_PASSWORD=supersecret
SERVICE_PASSWORD=supersecret
DATABASE_TYPE=mysql
SERVICE_HOST=192.168.0.6
MYSQL_HOST=$SERVICE_HOST
RABBIT_HOST=$SERVICE_HOST

# 只需要neutron而已
ENABLED_SERVICES=q-agt

等Controller的Devstack跑完就可以開始執行了

安裝Kubeadm

步驟跟Controller完全一樣

部署Kubeadm

把剛剛controllerkubeadm init完的那一串貼上來
大概像這樣
kubeadm join --token : --discovery-token-ca-cert-hash sha256:

部署Kuryr-kubernetes

mkdir kuryr-k8s-controller
cd kuryr-k8s-controller
virtualenv env
git clone http://git.openstack.org/openstack/kuryr-kubernetes
. env/bin/activate
pip install -e kuryr-kubernetes

建立配置文件/etc/kuryr/kuryr.conf

[DEFAULT]
use_stderr = true
# 通常是 /usr/local/libexec/kuryr
bindir = {path_to_env}/libexec/kuryr
# 官方沒有給這一項設定,但是我運行的時候被要求設定這一項
# 有遇到可以把註解移掉
# lock_path=

[kubernetes]
# 填master的IP
api_root = http://{ip_of_kubernetes_apiserver}:8080

配置cni文件

# 剛剛已經把flannel掛上去了,所以/opt/cni/bin多半已經存在
mkdir -p /opt/cni/bin
ln -s $(which kuryr-cni) /opt/cni/bin/

然後建立一個/etc/cni/net.d/10-kuryr.conf文件
這邊要注意到,kubernetes只會讀取/etc/cni/net.d/中的第一個檔案
剛剛的flannel也會在裡面,kuryr很可能不會被讀進去
所以建立完文件之後,要把flannel的檔名改掉,讓他變成不是第一個

{
"cniVersion": "0.3.0",
"name": "kuryr",
"type": "kuryr-cni",
"kuryr_conf": "/etc/kuryr/kuryr.conf",
"debug": true
}

安裝相依套件

deactivate
sudo pip install 'oslo.privsep>=1.20.0' 'os-vif>=1.5.0'
. env/bin/activate

一樣,確定執行沒問題

kuryr-daemon --config-file /etc/kuryr/kuryr.conf -d

放進去screen跑

screen -dm kuryr-daemon --config-file /etc/kuryr/kuryr.conf -d

發表留言