Kubernetes(ubuntu 三節點)在自己本機上搭建過程

最近在學習k8s,一直在線上學習。決定自己搭建一個在自己本地跑的k8s環境。爲了檢驗自己在學習成果之外,更是讓自己學了會用起來。

部署軟件版本

Docker: `docker-ce 18.06`

Kubernetes: `k8s 1.13.1

必要條件

1.準備三臺ubuntu虛擬機(要是有三臺主機的請忽略這一點),在本地搭建環境的化,推薦安裝server版的沒有Desktop,節省資源。可以k8s集羣跑起來不太卡。
2.推薦安裝xshell, xftp。這中遠程控制linux的軟件。在配置集羣的時候方便管理虛擬機。
3. 推薦虛擬機跑在vmware 上。不太推薦VirtualBox.畢竟收費更好用一點。(手動滑稽)。
4. 最好做一步,就來一個快照,方便做錯,之後回覆。
附上 用xshell管理虛擬機的照片,比單個虛擬機之間來回切換好多了。
左邊的是master 節點的終端 右邊的是兩個子節點的終端

在這裏插入圖片描述

基本配置

安裝Ubuntu

這種教程網上一大堆,可以自己去百度一下啊,或者谷歌一下。不過,記得安裝的時候把ssh安裝上,要是沒有安裝上,請看我的另一篇,如何在Ubuntu上安裝並配置ssh

配置Ubuntu

修改主機名

1. 用root用戶登錄
2. 打開配置文件 /etc/cletc/cloud/cloud.cfg (每個發行版的配置文件不同,請按照自己的版本,找自己的配置文件)
3. 修改配置 perserve_hostname: true 
4. 重啓 讓配置文件生效

配置IP(NAT模式)

動態獲取
1.用root用戶登錄
2.在/etc//編寫自己的網絡配置文件 我的配置文件是 /etc/netplan/50-cloud-init.yaml
network:
    ethernets:
        ens33:
             dhcp4: false
     version: 2     
 3. 使配置文件生效 ,並重啓
 netplan apply 
 shutdown -r now
靜態IP(永久有效)
過程和動態的一樣,只不過配置文件不一樣
network:
    ethernets:
        ens33:
            addresses: [192.168.80.144/24]
            dhcp4: false
            gateway4: 192.168.80.131
            nameservers:
                       addresses: [192.168.80.131]
            optional: true
    version: 2          

靜態的需要 指明ip地址 和其他網絡配置  新手推薦動態獲取

修改Hosts

這一步 是爲了讓主機通過別名找到集羣中的別的主機
編輯 /etc/hosts
把集羣的主機ip 和別名 按照下面格式寫下來
192.168.80.144 master
重啓 讓配置生效

docker 安裝

推薦看我的另一篇 安裝docker

k8s安裝及部署

之前這些工作做完之後,可以開始搭建k8s了,一下不具體指明的操作都是三個節點都需要執行了。
我集羣主機分配具體如下:

192.168.80.144 master
192.168.80.145 node1
192.168.80.146 node2

k8s安裝

配置並安裝k8s國內源

  1. 創建配置文件sudo touch /etc/apt/sources.list.d/kubernetes.list

  2. 添加寫權限

    zxt@master:~$ sudo chmod 666 /etc/apt/sources.list.d/kubernetes.list 
    

    再添加,內容如下:

    deb http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial main
    
  3. 執行sudo apt update 更新操作系統源,開始會遇見如下錯誤

    zxt@master:~$ sudo apt update
    Get:1 http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial InRelease [8,993 B]
    Err:1 http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial InRelease    
      The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 6A030B21BA07F4FB
    Hit:2 http://mirrors.aliyun.com/ubuntu cosmic InRelease                        
    Hit:3 http://mirrors.aliyun.com/ubuntu cosmic-updates InRelease                
    Hit:4 http://mirrors.aliyun.com/ubuntu cosmic-backports InRelease              
    Hit:5 http://mirrors.aliyun.com/ubuntu cosmic-security InRelease               
    Err:6 https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu cosmic InRelease      
      Could not wait for server fd - select (11: Resource temporarily unavailable) [IP: 202.141.176.110 443]
    Reading package lists... Done                          
    W: GPG error: http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 6A030B21BA07F4FB
    E: The repository 'http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial InRelease' is not signed.
    N: Updating from such a repository can't be done securely, and is therefore disabled by default.
    N: See apt-secure(8) manpage for repository creation and user configuration details.
    

    其中:

    The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 6A030B21BA07F4FB
    

    簽名認證失敗,需要重新生成。記住上面的NO_PUBKEY 6A030B21BA07F4FB

  4. 添加認證key

    運行如下命令,添加錯誤中對應的key(錯誤中NO_PUBKEY後面的key的後8位)

    gpg --keyserver keyserver.ubuntu.com --recv-keys BA07F4FB
    

    接着運行如下命令,確認看到OK,說明成功,之後進行安裝:

    gpg --export --armor BA07F4FB | sudo apt-key add -
    
  5. 再次重新sudo apt update更新系統下載源數據列表

zxt@master:~$ sudo apt update
Hit:1 https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu cosmic InRelease                  
Hit:2 http://mirrors.aliyun.com/ubuntu cosmic InRelease                                    
Hit:3 http://mirrors.aliyun.com/ubuntu cosmic-updates InRelease                            
Hit:4 http://mirrors.aliyun.com/ubuntu cosmic-backports InRelease                          
Hit:5 http://mirrors.aliyun.com/ubuntu cosmic-security InRelease                           
Get:6 http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial InRelease [8,993 B]      
Ign:7 http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial/main amd64 Packages
Get:7 http://mirrors.ustc.edu.cn/kubernetes/apt kubernetes-xenial/main amd64 Packages [26.6 kB]
Fetched 26.6 kB in 42s (635 B/s)    
Reading package lists... Done
Building dependency tree       
Reading state information... Done
165 packages can be upgraded. Run 'apt list --upgradable' to see them.

以上沒有報和錯誤異常,表示成功。

禁止基礎設施

  1. 禁止防火牆

    $ sudo ufw disable
    Firewall stopped and disabled on system startup
    
  2. 關閉swap

    # 成功
    $ sudo swapoff -a 
    # 永久關閉swap分區
    $ sudo sed -i 's/.*swap.*/#&/' /etc/fstab
    
  3. 禁止selinux

# 安裝操控selinux的命令
$ sudo apt install -y selinux-utils
# 禁止selinux
$ setenforce 0
# 重啓操作系統
$ shutdown -r now
# 查看selinux是否已經關閉
$ sudo getenforce
Disabled(表示已經關閉)

k8s系統網絡配置

(1) 配置內核參數,將橋接的IPv4流量傳遞到iptables的鏈

創建/etc/sysctl.d/k8s.conf文件

添加內容如下:

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
vm.swappiness = 0

(2) 執行命令使修改生效

# 【候選】建議執行下面的命令
$ sudo modprobe br_netfilter
$ sudo sysctl -p /etc/sysctl.d/k8s.conf

安裝k8s

注意: 切換到root用戶 $ su

  1. 安裝Kubernetes 目前安裝版本 v1.13.1

    $ apt update && apt-get install -y kubelet=1.13.1-00 kubernetes-cni=0.6.0-00 kubeadm=1.13.1-00 kubectl=1.13.1-00
    
  2. 設置爲開機重啓

    $ sudo systemctl enable kubelet && systemctl start kubelet
    $ sudo shutdown -r now
    

驗證k8s

  1. 使用root用戶登錄Master主機

  2. 執行如下個命令

    kubectl get nodes 
    

輸出如下

   $ kubectl get nodes
   The connection to the server localhost:8080 was refused - did you specify the right host or port?
  1. 查看當前k8s版本

    $ kubectl version
    
Client Version: version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.1", GitCommit:"eec55b9ba98609a46fee712359c7b5b365bdd920", GitTreeState:"clean", BuildDate:"2018-12-13T10:39:04Z", GoVersion:"go1.11.2", Compiler:"gc", Platform:"linux/amd64"}
The connection to the server localhost:8080 was refused - did you specify the right host or port?

節點的配置

把每個節點的主機名字改成集羣中的名字,ip地址可以選擇動態獲取,也可以寫全部改成金泰的

1. 使用root用戶登錄
2. 打開配置文件`vim /etc/cloud/cloud.cfg`
3. 修改配置`preserve_hostname: true`

修改hosts文件

使用root用戶登錄

1. 打開hosts文件 `vim /etc/hosts`

2. 輸入如下內容

   ```shell
   192.168.80.144 master
   192.168.80.145 node1
   192.168.80.146 node2
  
3. 重啓機器`shutdown -r now`

配置master節點

創建工作目錄`

`$ mkdir /home/zxt/working
$ cd /home/zxt/working/

創建kubeadm.conf配置文件

  1. 創建k8s的管理工具kubeadm對應的配置文件,候選操作在home/zxt/working/目錄下

使用kubeadm配置文件,通過在配置文件中指定docker倉庫地址,便於內網快速部署。

生成配置文件

kubeadm config print init-defaults ClusterConfiguration > kubeadm.conf
  1. 修改kubeadm.conf中的如下兩項:
  • imageRepository
  • kubernetesVersion
vi kubeadm.conf
# 修改 imageRepository: k8s.gcr.io
# 改爲 registry.cn-beijing.aliyuncs.com/imcto
imageRepository: registry.cn-beijing.aliyuncs.com/imcto
# 修改kubernetes版本kubernetesVersion: v1.13.0
# 改爲kubernetesVersion: v1.13.1
kubernetesVersion: v1.13.1
  1. 修改kubeadm.conf中的API服務器地址,後面會頻繁使用這個地址。
  • localAPIEndpoint:
localAPIEndpoint:
  advertiseAddress: 192.168.80.144
  bindPort: 6443

注意: 192.168.236.177是master主機的ip地址

  1. 配置子網網絡
networking:
  dnsDomain: cluster.local
  podSubnet: 10.244.0.0/16
  serviceSubnet: 10.96.0.0/12
scheduler: {}

這裏的10.244.0.0/1610.96.0.0/12分別是k8s內部pods和services的子網網絡,最好使用這個地址,後續flannel網絡需要用到。

拉去K8S必須的鏡像

  1. 查看一下都需要哪些鏡像文件需要拉取
$ kubeadm config images list --config kubeadm.conf
registry.cn-beijing.aliyuncs.com/imcto/kube-apiserver:v1.13.1
registry.cn-beijing.aliyuncs.com/imcto/kube-controller-manager:v1.13.1
registry.cn-beijing.aliyuncs.com/imcto/kube-scheduler:v1.13.1
registry.cn-beijing.aliyuncs.com/imcto/kube-proxy:v1.13.1
registry.cn-beijing.aliyuncs.com/imcto/pause:3.1
registry.cn-beijing.aliyuncs.com/imcto/etcd:3.2.24
registry.cn-beijing.aliyuncs.com/imcto/coredns:1.2.6
  1. 拉取鏡像
#下載全部當前版本的k8s所關聯的鏡像
kubeadm config images pull --config ./kubeadm.conf

5.3.4 初始化kubernetes環境

#初始化並且啓動
$ sudo kubeadm init --config ./kubeadm.conf

更多kubeadm配置文件參數詳見

kubeadm config print-defaults

k8s啓動成功輸出內容較多,但是記住末尾的內容

Your Kubernetes master has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of machines by running the following on each node
as root:

  kubeadm join 192.168.80.144:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:e778d3665e52f5a680a87b00c6d54df726c2eda601c0db3bfa4bb198af2262a8

按照官方提示,執行以下操作。

  1. 執行如下命令

    $ mkdir -p $HOME/.kube
    $ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
    $ sudo chown $(id -u):$(id -g) $HOME/.kube/config
    
  2. 創建系統服務並啓動

# 啓動kubelet 設置爲開機自啓動
$ sudo systemctl enable kubelet
# 啓動k8s服務程序
$ sudo systemctl start kubelet

驗證kubernetes啓動結果

  1. 驗證輸入,注意顯示master狀態是NotReady,證明初始化服務器成功
$ kubectl get nodes
NAME     STATUS     ROLES    AGE   VERSION
master   NotReady   master   12m   v1.13.1
  1. 查看當前k8s集羣狀態
$ kubectl get cs
NAME                 STATUS    MESSAGE              ERROR
scheduler            Healthy   ok
controller-manager   Healthy   ok
etcd-0               Healthy   {"health": "true"}

目前只有一個master,還沒有node,而且是NotReady狀態,那麼我們需要將node加入到master管理的集羣中來。在加入之前,我們需要先配置k8s集羣的內部通信網絡,這裏採用的是flannel網絡。

部署flannel網絡

$cd  /home/zxt/working
$wget https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml

編輯這個文件,確保flannel網絡是對的,找到net-conf.json標記的內容是否正確。

 net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "Backend": {
        "Type": "vxlan"
      }

這個"10.244.0.0/16"和 ./kubeadm.conf中的podsubnet的地址要一致。

應用當前flannel配置文件

itcast@master:~/working$ kubectl apply -f kube-flannel.yml 

輸出結果如下

root@master:~/working# kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/a70459be0084506e4ec919aa1c114638878db11b/Documentation/kube-flannel.yml
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.extensions/kube-flannel-ds-amd64 created
daemonset.extensions/kube-flannel-ds-arm64 created
daemonset.extensions/kube-flannel-ds-arm created
daemonset.extensions/kube-flannel-ds-ppc64le created
daemonset.extensions/kube-flannel-ds-s390x created

配置Node

確認外部環境

  1. 確認關閉swap

    apt install -y selinux-utils
    swapoff -a
    
  2. 禁止selinux

    setenforce 0
    
  3. 確認關閉防火牆

    ufw disable
    

配置k8s集羣的Node主機環境

  1. 啓動k8s後臺服務

    # 啓動kubelet 設置爲開機自啓動
    $ sudo systemctl enable kubelet
    # 啓動k8s服務程序
    $ sudo systemctl start kubelet
    
  2. 將master機器的/etc/kubernetes/admin.conf傳到到node1和node2

    登錄master終端

    #將admin.conf傳遞給node1
    sudo scp /etc/kubernetes/admin.conf [email protected]:/home/zxt/
    #將admin.conf傳遞給node2
    sudo scp /etc/kubernetes/admin.conf [email protected]:/home/zxt/
    
  3. 登錄node1終端,創建基礎kube配置文件環境

$ mkdir -p $HOME/.kube
$ sudo cp -i $HOME/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
  1. 登錄node2終端,創建基礎kube配置文件環境
$ mkdir -p $HOME/.kube
$ sudo cp -i $HOME/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
  1. node1node2分別連接master加入master集羣。這裏用的是kubeadm join指令
$ sudo kubeadm join 192.168.236.177:6443 --token abcdef.0123456789abcdef --discovery-token-ca-cert-hash sha256:e778d3665e52f5a680a87b00c6d54df726c2eda601c0db3bfa4bb198af2262a8

這裏要注意,使用的hash應該是master主機 kubeadm init成功之後生成的hash碼。

  1. 應用兩個node主機分別應用flannel網絡

master中的kube-flannel.yml分別傳遞給兩個node節點.

#將kube-flannel.yml傳遞給node1
sudo scp $HOME/working/kube-flannel.yml [email protected]:/home/zxt/
#將kube-flannel.yml傳遞給node2
sudo scp $HOME/working/kube-flannel.yml [email protected]:/home/zxt/

分別啓動flannel網絡

zxt@node1:~$ kubectl apply -f kube-flannel.yml 
zxt@node2:~$ kubectl apply -f kube-flannel.yml
  1. 查看node是否已經加入到k8s集羣中(需要等一段時間才能ready)
zxt@node2:~$ kubectl get nodes
NAME     STATUS   ROLES    AGE     VERSION
master   Ready    master   35m     v1.13.1
node1    Ready    <none>   2m23s   v1.13.1
node2    Ready    <none>   40s     v1.13.1

這樣k8s就搭建起來了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章