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