天天看點

【Kubernetes系列】第3篇 Kubernetes叢集安裝部署

【Kubernetes系列】第3篇 Kubernetes叢集安裝部署

本文介紹了如何通過Kubespray來進行部署高可用k8s叢集,k8s版本為1.12.5。

1、部署手冊

代碼倉庫:

https://github.com/kubernetes-sigs/kubespray

參考文檔:

https://kubespray.io/#/

2、k8s master機器配置

【Kubernetes系列】第3篇 Kubernetes叢集安裝部署

3、k8s 叢集安裝步驟

step1: 設定主機間的免密登入

由于kubespray是依賴于ansible,ansible通過ssh協定進行主機之間的通路,是以部署之前需要設定主機之間免密登入,步驟如下:

ssh-keygen -t rsa
scp ~/.ssh/id_rsa.pub root@IP:/root/.ssh
ssh root@IP
cat /root/.ssh/id_rsa.pub >> /root/.ssh/authorized_keys           

step2: 下載下傳kubespray

注意:不要通過使用github倉庫master分支的代碼,我這裡使用的是tag v2.8.3進行部署

wget https://github.com/kubernetes-sigs/kubespray/archive/v2.8.3.tar.gz
tar -xvf v2.8.3
cd kubespray-v2.8.3
           

step3: 配置調整

3.1 更換鏡像

Kubernetes安裝大部分都是使用的國外的鏡像,由于防火牆原因沒有辦法擷取到這些鏡像,是以需要自己建立鏡像倉庫并将這些鏡像擷取到上傳到鏡像倉庫中。

3.1.1 建立鏡像倉庫

鏡像倉庫我們選用的元件是Harbor,安裝步驟參考:

https://github.com/goharbor/harbor/blob/master/docs/installation_guide.md
3.1.2 整理k8s叢集部署中需要使用的鏡像

在檔案roles/download/defaults/main.yml檔案中,可以看到使用的全量鏡像清單,注意某些鏡像由于功能未使用的原因是以暫時沒有用到,我們主要用到有如下鏡像:

【Kubernetes系列】第3篇 Kubernetes叢集安裝部署

3.1.3 下載下傳所需鏡像并上傳至私有鏡像倉庫

使用的鏡像清單如下,在這裡我申請了一台國外的阿裡雲主機,在該台主機下載下傳所需鏡像然後上傳至私有鏡像倉庫

例如操作某個鏡像時,需要執行如下指令:

docker pull gcr.io/google_containers/kubernetes-dashboard-amd64:v1.10.0
docker tag gcr.io/google_containers/kubernetes-dashboard-amd64:v1.10.0 106.14.219.69:5000/google_containers/kubernetes-dashboard-amd64:v1.10.0
docker push 106.14.219.69:5000/google_containers/kubernetes-dashboard-amd64:v1.10.0
           
3.1.4 更改鏡像位址并修改Docker配置

在inventory/testcluster/group_vars/k8s-cluster/k8s-cluster.yml檔案中添加如下配置:

# kubernetes image repo define
kube_image_repo: "10.0.0.183:5000/google_containers"
## modified by: robbin
# comment: 将使⽤的元件的鏡像倉庫修改為私有鏡像倉庫位址
etcd_image_repo: "10.0.0.183:5000/coreos/etcd"
coredns_image_repo: "10.0.0.183:5000/coredns"
calicoctl_image_repo: "10.0.0.183:5000/calico/ctl"
calico_node_image_repo: "10.0.0.183:5000/calico/node"
calico_cni_image_repo: "10.0.0.183:5000/calico/cni"
calico_policy_image_repo: "10.0.0.183:5000/calico/kube-controllers"
hyperkube_image_repo: "{{ kube_image_repo }}/hyperkube-{{ image_arch }}"
pod_infra_image_repo: "{{ kube_image_repo }}/pause-{{ image_arch }}"
dnsautoscaler_image_repo: "{{ kube_image_repo }}/cluster-proportional-autoscaler-{
{ image_arch }}"
dashboard_image_repo: "{{ kube_image_repo }}/kubernetes-dashboard-{{ image_arch }}"
           

由于我們的私有鏡像倉庫未配置https證書,需要在 inventory/testcluster/group_vars/all/docker.yml檔案中添加如下配置:

docker_insecure_registries:
- 10.0.0.183:5000
           

3.2 Docker安裝源更改以及執行檔案預處理

3.2.1 Docker安裝源更改

由于預設從Docker官方源安裝docker,速度非常慢,這裡我們更換為國内阿裡源,在inventory/testcluster/group_vars/k8s-cluster/k8s-cluster.yml檔案中添加如下配置:

# CentOS/RedHat docker-ce repo
docker_rh_repo_base_url: 'https://mirrors.aliyun.com/docker-ce/linux/centos/7/$basearch/stable'
docker_rh_repo_gpgkey: 'https://mirrors.aliyun.com/docker-ce/linux/centos/gpg'
dockerproject_rh_repo_base_url: 'https://mirrors.aliyun.com/docker-engine/yum/repo/main/centos/7'
dockerproject_rh_repo_gpgkey: 'https://mirrors.aliyun.com/docker-engine/yum/gpg'
           
3.2.2 可執行檔案預處理

另外由于需要從google以及github下載下傳一些可執行檔案,由于防火牆原因無法直接在伺服器上下載下傳,我們可以預先将這些執行檔案下載下傳好,然後上傳到指定的伺服器路徑中

可執行檔案下載下傳位址可以在roles/download/defaults/main.yml檔案中查找到,下載下傳路徑如下:

kubeadm_download_url: "https://storage.googleapis.com/kubernetes-release/release/v
1.12.5/bin/linux/amd64/kubeadm"
hyperkube_download_url: "https://storage.googleapis.com/kubernetes-release/release
/v1.12.5/bin/linux/amd64/hyperkube"
cni_download_url: "https://github.com/containernetworking/plugins/releases/downloa
d/v0.6.0/cni-plugins-amd64-v0.6.0.tgz"
           

接下來修改檔案權限,并上傳到每台伺服器的/tmp/releases目錄下

chmod 755 cni-plugins-amd64-v0.6.0.tgz hyperkube kubeadm
scp cni-plugins-amd64-v0.6.0.tgz hyperkube kubeadm root@node1:/tmp/releases
           

3.3 元件清單

k8s所需要的元件

【Kubernetes系列】第3篇 Kubernetes叢集安裝部署

可選插件清單

【Kubernetes系列】第3篇 Kubernetes叢集安裝部署

3.4 DNS方案

k8s的服務發現依賴于DNS,涉及到兩種類型的網絡:主機網絡和容器網絡,是以Kubespray提供了兩種配置來進行管理

3.4.1 dns_mode

dns_mode 主要用于叢集内的域名解析,有如下幾種類型,我們的技術選型是coredns,注意:選擇某種dns_mode,可能需要下載下傳安裝多個容器鏡像,其鏡像版本也可能不同

【Kubernetes系列】第3篇 Kubernetes叢集安裝部署
3.4.2 resolvconf_mode

resolvconf_mode主要用來解決當容器部署為host網絡模式的時候,如何使用k8s的dns,這裡我們使用的是docker_dns

resolvconf_mode: docker_dns
           

3.5 網絡插件選擇

3.5.1 kube-proxy

kube-proxy可以選擇ipvs或者iptables,在這裡我們選擇的是ipvs模式,關于這兩者的差別可以參考 華為雲在 K8S 大規模場景下的 Service 性能優化實踐(

https://zhuanlan.zhihu.com/p/37230013

)

3.5.2 網絡插件清單

網絡插件清單如下,我們的技術選型是calico,注意:選擇某種網絡插件,可能需要一個或多個容器鏡像,其鏡像版本也可能不同

【Kubernetes系列】第3篇 Kubernetes叢集安裝部署

3.6 高可用方案

step4: 按照如下步驟進行安裝部署

# Install dependencies from ``requirements.txt``
sudo pip install -r requirements.txt
# Copy `inventory/sample` as `inventory/mycluster`
cp -rfp inventory/sample inventory/mycluster
# Update Ansible inventory file with inventory builder
declare -a IPS=(10.10.1.3 10.10.1.4 10.10.1.5)
CONFIG_FILE=inventory/mycluster/hosts.ini python3 contrib/inventory_builder/invent
ory.py ${IPS[@]}
# Review and change parameters under `inventory/mycluster/group_vars`
cat inventory/mycluster/group_vars/all/all.yml
cat inventory/mycluster/group_vars/k8s-cluster/k8s-cluster.yml
# Deploy Kubespray with Ansible Playbook - run the playbook as root
# The option `-b` is required, as for example writing SSL keys in /etc/,
# installing packages and interacting with various systemd daemons.
# Without -b the playbook will fail to run!
ansible-playbook -i inventory/mycluster/hosts.ini --become --become-user=root clus
ter.yml
           

部署完成,可以登入到k8s-master所在的主機,執行如下指令,可以看到各個元件正常

kubectl cluster-info
kubectl get node
kubectl get pods --all-namespaces
           
https://github.com/kubernetes-sigs/kubespray/blob/master/docs/getting-started.md https://xdatk.github.io/2018/04/16/kubespray2/ https://jicki.me/kubernetes/docker/2018/12/21/k8s-1.13.1-kubespray/