1. 程式人生 > >使用kubeadm安裝部署k8s V1.12.1(兩種方式)

使用kubeadm安裝部署k8s V1.12.1(兩種方式)

規劃

預計使用三個節點來完成k8s的初次體驗工作。結點規劃如下表所示。

IP 節點角色 工作職責
192.168.217.129 master 對外暴露API,對內提供工作流的排程和配置
192.168.217.130 node1 承載著k8s執行的實際任務
192.168.217.131 node2 同node1相同

部署前提

  • 主機名稱解析,(在/etc/hosts檔案編輯相關資訊即可)
# vim /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
master 192.168.217.129
node1  192.168.217.130
node2  192.168.217.131
# master,node1,node2等節點的ip應按照自己的實際情況來填寫。

將上述配置檔案拷貝到叢集中的所有節點,包括master節點和node節點。

  • 時間同步,(使用chrony服務實現)
    各個節點的操作如下:
yum -y install chrony 

vim /etc/chrony.conf

~~~
server master
#server 1.centos.pool.ntp.org iburst
#server 2.centos.pool.ntp.org iburst
#server 3.centos.pool.ntp.org iburst
~~~~
#註釋掉原有的server內容,把原有的時鐘同步服務設定為master結點上的時鐘同步。

  • 關閉所有節點的iptables和firewalld以及selinux
iptables -F
systemctl stop firewalld
systemctl disable firewalld

配置yum倉庫

所有節點都要配倉庫

配置docker倉庫

wget -P /etc/yum.repos.d/ https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #從阿里雲獲取docker-ce的映象檔案,-P指定下載檔案存放的目錄 
yum -y install docker-ce 
# yum安裝docker普通版 
systemctl start docker.service 
#開啟docker 
systemctl enable docker.service #設定docker為開機自啟動

配置k8s倉庫

cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
setenforce 0

安裝相關元件

各個結點上都安裝相關元件

yum install  kubelet kubeadm kubectl 
#所有服務都設定為開機自啟動
systemctl enable kubelet
 

結點的初始化與叢集的橫向擴充套件

初始化master節點

使用kubeadm配置master節點的時候,會存在拉取映象的問題,其主要原因在於相關元件的映象都在外網上,想要拉取這些映象,主要有兩種辦法。

  • 在docker Unit File中的Environment中定義代理上網,這樣docker在實際拉取映象的時候,就能夠通過代理去拉取映象。
  • 在本地下載好相關的映象,然後將映象打包傳到伺服器上。

在此,先使用第一種方式代理上網(需要自己想辦法到外網)
這是我經常使用的一個機場,通過我的邀請碼註冊的話,不需要驗證化學方程式:
代理上網申請

1.1 在docker Unit File中定義代理上網,通過代理上網獲取到相關映象。沒有代理的話,直接看1.2步驟即可。

vim /usr/lib/systemd/system/docker.service 
#開啟docker的unit配置檔案
[Service]
~~~
Environment="HTTP_PROXY=http://[proxy-addr]:[proxy-port]/" "HTTPS_PROXY=https://[proxy-addr]:[proxy-port]/"
~~~
#新增上相關代理的地址和埠


1.2 直接使用我打包好的映象。
1.1或者1.2執行一個即可

rz -be 
# 上傳映象到相關節點上。
docker load -i k8s_master.tar 
#master節點上執行,獲取master需要用到的映象

docker image ls
#檢視所需映象是否都已經匯入

REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
k8s.gcr.io/kube-proxy                v1.12.1             61afff57f010        3 weeks ago         96.6MB
k8s.gcr.io/kube-scheduler            v1.12.1             d773ad20fd80        3 weeks ago         58.3MB
k8s.gcr.io/kube-controller-manager   v1.12.1             aa2dd57c7329        3 weeks ago         164MB
k8s.gcr.io/kube-apiserver            v1.12.1             dcb029b5e3ad        3 weeks ago         194MB
k8s.gcr.io/etcd                      3.2.24              3cab8e1b9802        5 weeks ago         220MB
k8s.gcr.io/coredns                   1.2.2               367cdc8433a4        2 months ago        39.2MB
quay.io/coreos/flannel               v0.10.0-amd64       f0fad859c909        9 months ago        44.6MB
k8s.gcr.io/pause                     3.1                 da86e6ba6ca1        10 months ago       742kB

2.禁用節點上的swap,防止將來出現的意外問題。

swapoff -a 
sysctl -p

vim /ets/fstab
#去除該檔案中關於swap那行。
  1. 開啟路由轉發功能以及iptables的過濾策略。
vim /etc/sysctl.d/k8s.conf


net.bridge.bridge-nf-call-ip6tables = 1
#開啟iptables中ipv6的過濾規則
net.bridge.bridge-nf-call-iptables = 1
#開啟ipv4的過濾規則
net.ipv4.ip_forward = 1
#開啟伺服器的路由轉發功能

執行命令使修改生效。

modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf

3.初始化master節點

kubeadm init  --kubernetes-version=v1.12.1  --pod-network-cidr=10.244.0.0/16 --apiserver-advertise-address=192.168.217.129
#--kubernetes-version指明要下載的映象版本
#--pod-network-cidr 指明網路的子網掩碼,此處使用flannel模型的子網掩碼
#--apiserver-advertise-address 指明與master結點繫結的ip

儲存初始化後的那段話,將來新加入結點或者做別的操作的時候,可能會用到相關內容。
一定要儲存初始化後面的那段話,在你加入新節點的時候,很可能會用到,每個人都不太一樣。

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.217.129:6443 --token vtqzkt.j0u1chomafn1offd --discovery-token-ca-cert-hash sha256:c25549dc8457677752b8d1b0547acfa8be742cbd5734802b6d2e3e9a6e7e1b73

4.配置常規使用者如何使用kubectl訪問叢集
新建一個使用者k8s,並給予其sudo許可權,之後對於k8s的操作都是用這個k8s使用者。

useradd k8s 
passwd k8s
# 建立使用者,並對建立的使用者設定密碼

chmod u+w /etc/sudoers
vim /etc/sudoers
#找到 root ALL這一行
#複製貼上這行內容,同時將名字修改為k8s即可
chmod u-w /etc/sudoers

切換到k8s使用者身份,執行以下命令。

su - k8s 

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

5.配置命令補全功能

echo "source <(kubectl completion bash)" >> ~/.bashrc

6.配置flannel網路功能

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 下載flannel的yaml檔案
kubectl apply -f  kube-flannel.yml
# 執行這個檔案生成flannel的pods

新增一個新的節點到叢集

1.永久關閉掉swap。

swapoff -a     
vim /etc/fstab 
# 刪除掉檔案中關於swap的一行


2.1 配置docker代理上網,以便拉取映象。沒有代理的話,通過2.2使用我打包好的映象。

vim /usr/lib/systemd/system/docker.service 
#開啟docker的unit配置檔案
[Service]
~~~
Environment="HTTP_PROXY=http://[proxy-addr]:[proxy-port]/" "HTTPS_PROXY=https://[proxy-addr]:[proxy-port]/"
~~~
#新增上相關代理的地址和埠

2.2 ,如果沒有代理的話,匯入打包好的映象。

rz -be 
# 將pc上的tar檔案上傳到相關節點上。

docker load -i k8s_ndoe.tar 
#node節點上執行,獲取node需要用到的映象
docker image ls
#檢視所需映象是否都已經匯入
REPOSITORY               TAG                 IMAGE ID            CREATED             SIZE
k8s.gcr.io/kube-proxy    v1.12.1             61afff57f010        3 weeks ago         96.6MB
quay.io/coreos/flannel   v0.10.0-amd64       f0fad859c909        9 months ago        44.6MB
k8s.gcr.io/pause         3.1                 da86e6ba6ca1        10 months ago       742kB

3.開啟路由轉發功能以及iptables的過濾策略。

vim /etc/sysctl.d/k8s.conf


net.bridge.bridge-nf-call-ip6tables = 1
#開啟iptables中ipv6的過濾規則
net.bridge.bridge-nf-call-iptables = 1
#開啟ipv4的過濾規則
net.ipv4.ip_forward = 1
#開啟伺服器的路由轉發功能

執行命令使修改生效。

modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf

4.執行加入節點的命令

kubeadm join 192.168.217.129:6443 --token vtqzkt.j0u1chomafn1offd --discovery-token-ca-cert-hash sha256:c25549dc8457677752b8d1b0547acfa8be742cbd5734802b6d2e3e9a6e7e1b73

5.在mster結點上執行命令檢視結果

kubectl get nodes 

NAME     STATUS   ROLES    AGE    VERSION
master   Ready    master   171m   v1.12.1
node1    Ready    <none>   11m    v1.12.1
#得到這樣的結果說明已經能夠成功使用了

小結

尚有兩個問題沒有解決。

  • 1.目前的叢集中使用的是iptables進行負載均衡,實際上可以使用效能更好的ipvs,有待後面研究。
  • 2.叢集中現在的網路是flannel,後面考慮如何平穩的過渡為calico網路模型。