全棧工程師開發手冊 (作者:欒鵬)
架構系列文章
每個主機切換到同一具有sudo權限的用戶,加入用戶爲k8s_user,
k8s各節點SSH免密登錄。
各節點時間同步。
各節點主機名和IP加入/etc/hosts解析
各Node必須關閉swap:swapoff -a,否則kubelet啓動失敗。
設置每個節點的主機信息
1、master上執行:
a) 設置主機名稱命令:hostnamectl --static set-hostname k8s-master
b) 關閉防火牆命令:
systemctl disable firewalld.service
systemctl stop firewalld.service
c) 設置hosts命令:
echo '192.168.72.183 k8s-master
192.168.72.183 etcd
192.168.72.183 registry
192.168.72.184 k8s-node-1' >> /etc/hosts
2、 node上執行:
a) 設置主機名稱命令:hostnamectl --static set-hostname k8s-node-1
b) 關閉防火牆命令:
systemctl disable firewalld.service
systemctl stop firewalld.service
c) 設置hosts命令:
echo '192.168.72.183 k8s-master
192.168.72.183 etcd
192.168.72.183 registry
192.168.72.184 k8s-node-1' >> /etc/hosts
1、設置主機之間ssh無密碼登錄。
本地系統執行 ssh-keygen -t rsa 命令,生成密鑰文件
本地機器執行命令如:ssh-copy-id -i ~/.ssh/id_rsa.pub k8s-node-1
,ssh-copy-id -i ~/.ssh/id_rsa.pub k8s-master
將公鑰文件傳輸的遠程機器,並生效。
注意:
- 免密碼登錄的處理是用戶對用戶的,切換其他用戶後,仍然需要輸入密碼
- 公鑰傳到遠程機器並生效的操作,可用其他方式實現,如scp後修改authorized_keys
- 遠程機器的.ssh目錄需要700權限,authorized_keys文件需要600權限
2、每個主機節點安裝docker
下面的命令安裝docker,多運行幾次,有時網絡不好會出錯。(k8s目前支持docker17.03),所以最好不要安裝docker18.03
sudo apt-get update
sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common
# step 2: 安裝GPG證書
curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
# Step 3: 寫入軟件源信息
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
# Step 4: 更新並安裝 Docker-CE
sudo apt-get -y update
sudo apt-get -y install docker-ce
安裝最新版的
apt-get install docker.io
安裝指定版本
apt-cache madison docker-ce 查看支持的安裝版本
sudo apt-get install docker-ce=17.03.3~ce-0~ubuntu-xenial
卸載docker
sudo apt-get autoremove --purge docker-engine
sudo apt-get autoremove --purge docker-ce
卸載Docker後,/var/lib/docker/目錄下會保留原Docker的鏡像,網絡,存儲卷等文件. 如果需要全新安裝Docker,需要刪除/var/lib/docker/目錄
sudo rm -rf /var/lib/docker
CentOS7安裝
在CentOS7+上可以通過yum直接安裝(這個版本是1.12.6)。
yum -y install docker
啓用中國加速器
echo '{"registry-mirrors": ["http://bcfb7352.m.daocloud.io"]}' > /etc/docker/daemon.json
如果之前裝有其他版本的,需要刪除所有鏡像和容器,並卸載docker重裝
另一種配置中國加速器的方法,編輯配置文件
sudo vim /etc/docker/daemon.json
{
"registry-mirrors": [
"https://registry.hub.docker.com", # 如果設置registry-mirrors就必須要把官方鏡像加上才能拉取在docker hub上自己創建的倉庫
"https://2lqq34jg.mirror.aliyuncs.com",
"https://pee6w651.mirror.aliyuncs.com",
"https://registry.docker-cn.com",
"http://hub-mirror.c.163.com"
]
}
重啓docker.service
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo service docker restart
使用ansible部署k8s集羣
git地址:https://github.com/626626cdllp/k8s/tree/master/kube-ansible
使用rancher部署k8s集羣
將hostname改成小寫,這樣能順利安裝rke(rancher kubernetes enginer)
修改/etc/hostname
修改/etc/hosts
不然部署會報錯
Can not find RKE state file: open /var/lib/rancher/management-state/rke/rke-699207778/cluster.rkestate: no such file or directory
如果之前安裝過docker和k8s,需要運行
#刪除所有容器
sudo docker rm -f $(sudo docker ps -qa)
#刪除/var/etcd目錄
sudo rm -rf /var/etcd
#刪除/var/lib/kubelet/目錄,刪除前先卸載
for m in $(sudo tac /proc/mounts | sudo awk '{print $2}'|sudo grep /var/lib/kubelet);do
sudo umount $m||true
done
sudo rm -rf /var/lib/kubelet/
#刪除/var/lib/rancher/目錄,刪除前先卸載
for m in $(sudo tac /proc/mounts | sudo awk '{print $2}'|sudo grep /var/lib/rancher);do
sudo umount $m||true
done
sudo rm -rf /var/lib/rancher/
#刪除/run/kubernetes/ 目錄
sudo rm -rf /run/kubernetes/
#刪除所有的數據卷
sudo docker volume rm $(sudo docker volume ls -q)
#再次顯示所有的容器和數據卷,確保沒有殘留
sudo docker ps -a
sudo docker volume ls
有時需要重啓才能清理乾淨。
一定要把舊數據清理乾淨,etcd,rancher之類的,不然安裝不上。
先部署rancher
啓動
sudo docker run -d --restart=unless-stopped --name=rancher-server -p 8080:8080 rancher/server:stable
也可以安裝最新版的
sudo docker run -d --restart=unless-stopped -p 8001:80 -p 8002:443 -v /root/var/log/auditlog:/var/log/auditlog -e AUDIT_LEVEL=3 rancher/rancher:latest
這裏先說一下注意事項:
①rancher分爲master和agent。二者最好分開部署,不要讓一個節點既是master又是agent
②節點的資源要求:內存要不小於4G,推薦8G以上。4G以下,運行時服務經常會停止。
③所有節點都要配置時間同步
④提前將鏡像下載到節點並加載,可以大幅度提升安裝速度。(也可以搭建docker鏡像私庫)
⑤啓用Docker的中國加速器,否則部署會很慢
參照 https://www.docker-cn.com/registry-mirror 或者 https://www.daocloud.io
等待容器啓動訪問對應IP的8080端口的地址,在頁面右下腳,切換語言爲中文簡體。
先進入到環境管理,添加環境模板,選擇K8S,然後點擊編輯環境 。
修改以下可配置項,更換K8S私有倉庫地址
Private Registry for Add-Ons and Pod Infra Container Image的值爲
registry.cn-shenzhen.aliyuncs.com
但是由於有些鏡像更換鏡像地址以後可能就找不到了,所以建議還是不要添加這個私有倉庫地址。慢一點安裝。
點擊底部的設置,然後添加模板名稱k8s-CN,在頁面最下面點擊創建後就能看到有這樣一個模板了 。
再部署k8s
同樣在環境配置中選擇添加環境 ,填寫好名稱K8S-DEMO,選擇我們之前創建好的國內K8S模板k8s-CN。
創建好之後在左上角選擇我們創建的環境K8S-DEMO,可以看到初始化進度,等待添加主機。
選擇技術架構->主機,添加主機 ,設置主機連接到Rancher的地址(在內網情況下使用內網IP) ,由於我這裏是內網,所以直接使用的http://192.168.12.96:8080,也就是部署rancher-server的web地址,點擊保存後,選擇custom
在步驟4中,填入部署k8s的主機的ip,然後複製部署腳本,在該ip的主機上的運行部署命令。
點擊下面的關閉按鈕,新的主機註冊後會顯示在 主機 頁面。
再依次添加其他主機。
等待主機上的應用全部部署完成。(緩存的等待安裝,圓環的爲安裝完成,黃色三角形狀爲安裝失敗(主要是網絡原因),安裝失敗rancher會重新下載安裝,只要等待就行)
部署完成後 KUBERNETES——> 儀表盤,可以進入k8s的dashboard, 在KUBERNETES——> CLI執行kubectl命令行操作。
注意: 新版本部署已定要等kubernetes 版本選項出來才能部署(有時網絡可能會比較慢)
問題:我在部署時遇到kubelet worker docker不停重啓失敗問題。
Error (Error response from daemon: invalid mount config: must use either propagation mode "rslave" or "rshared" when mount source is within the daemon root, daemon root: "/var/lib/docker", bind mount source: "/var/lib/docker", propagation: "rprivate")
是因爲我這邊安裝的是docker18,掛在形式變了,所以需要做一些改動
mount --make-shared /
或配置docker.service設置
[Service]
MountFlags=shared
重啓docker.service
sudo systemctl daemon-reload
sudo systemctl restart docker
sudo service docker restart
用戶級配置文件:
/etc/docker/daemon.json(沒有則自己創建)
系統級配置文件:
/lib/systemd/system/docker.service —> 啓動服務腳本:systemctl start docker 命令就是調用此配置文件
配置參考
https://github.com/moby/moby/blob/master/contrib/init/systemd/docker.service
上面的教程可能不會成功, 那就還是換回docker17.03吧
每個節點上安裝kubectl
wget https://dl.k8s.io/v1.11.6/kubernetes-client-linux-amd64.tar.gz
tar -zxvf kubernetes-client-linux-amd64.tar.gz
cd kubernetes/client/bin
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
linux命令行通過tab鍵自動補全的方式
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
修改rancher安裝的應用的鏡像地址。
kubectl edit deployments monitoring-influxdb -n kube-system
將image地址由
registry.cn-shenzhen.aliyuncs.com /rancher/heapster-influxdb-amd64:v1.3.3
改成
rancher/heapster-influxdb-amd64:v1.3.3
注意每個deployment中不止有一個image設置點
使用自定義腳本部署k8s集羣
注意:目前Kubernetes爲Ubuntu提供的kube-up腳本,不支持15.10以及16.04這兩個使用systemd作爲init系統的版本。
使用自動化腳本,腳本下載地址:https://github.com/626626cdllp/k8s/tree/master/kubernetes
源碼下載好後,需要修改配置文件:
root# cd kubernetes/cluster/ubuntu
root# vim config-default.sh
要修改三個地方:
export nodes=${nodes:-"[email protected] [email protected] [email protected]"}
這裏是三個節點,有幾個就配幾個role=${role:-"ai i i"}
這裏的值與上面的對應,ai表示既是master又是minion,i表示minion節點。export NUM_NODES=${NUM_NODES:-3}
這裏的數字對應節點的個數
然後默認下載的二進制執行文件的版本比較老,我們修改以下,使用比較新的版本:
還是在kubernetes/cluster/ubuntu文件夾下,打開download-release.sh文件,修改如下幾行:
FLANNEL_VERSION=${FLANNEL_VERSION:-"0.5.5"}
ETCD_VERSION=${ETCD_VERSION:-"2.2.1"}
KUBE_VERSION=${KUBE_VERSION:-"1.1.7"}
保存上面兩個文件。
下面就開始部署了,kubernetes的部署挺傻瓜的,首先進入kubernetes/cluster文件夾下,執行如下命令:
root# KUBERNETES_PROVIDER=ubuntu ./kube-up.sh
其中KUBERNETES_PROVIDER指明瞭在Ubuntu上部署集羣。
運行此命令後,kubernetes首先根據指定的版本下載flanneld,etcd,kubernetes的可執行文件,由於國內網速較慢,可能需要一些時間,此後的工作會自動完成。
執行成功後,另外打開一個控制檯,使用kubectl get nodes測試是否搭建成功:
chy@chy-station:~$ kubectl get nodes
NAME LABELS STATUS AGE
10.203.2.233 kubernetes.io/hostname=10.203.2.233 Ready 1h
10.203.2.239 kubernetes.io/hostname=10.203.2.239 Ready 1h
10.203.2.243 kubernetes.io/hostname=10.203.2.243 Ready 1h
以上信息表示集羣搭建成功。
關閉集羣是在kubernetes/cluster文件夾下執行
root# KUBERNETES_PROVIDER=ubuntu ./kube-down.sh
使用kubeadm部署k8s集羣
參考:http://blog.51cto.com/newfly/2288088
不過要求的電腦能夠翻牆。
以root用戶ssh到每臺機器上,運行:
apt-get update && apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
echo 'deb http://apt.kubernetes.io/ kubernetes-xenial main' >/etc/apt/sources.list.d/kubernetes.list
apt-get update
apt-get install -y kubeadm
apt-get install -y kubelet kubeadm kubectl kubernetes-cni
#它會自動安裝kubeadm、kubectl、kubelet、kubernetes-cni、socat
其中下面命令需要翻牆
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
可以分解爲下面兩步
1、curl -O https://packages.cloud.google.com/apt/doc/apt-key.gpg
#該命令執行後會在當前目錄下保存一個名稱爲nodesource.gpg.key的文件。
2、使用apt-key命令加載獲取到的文件 apt-key add nodesource.gpg.key
後續參考:
https://www.jianshu.com/p/602c5bdbbd4d
http://windgreen.me/2018/02/23/%E5%9B%BD%E5%86%85%E4%BD%BF%E7%94%A8kubernetes%E8%B8%A9%E8%BF%87%E7%9A%84%E5%9D%91/
http://blog.51cto.com/newfly/2288088
手動安裝部署k8s集羣
下載etcd
在部署機上下載etcd
ETCD_VERSION=${ETCD_VERSION:-"3.3.9"}
ETCD="etcd-v${ETCD_VERSION}-linux-amd64"
curl -L https://github.com/coreos/etcd/releases/download/v${ETCD_VERSION}/${ETCD}.tar.gz -o etcd.tar.gz
tar xzf etcd.tar.gz -C /tmp
cd /tmp/etcd-v${ETCD_VERSION}-linux-amd64
for h in master node1 node2 node3 node4; do ssh user@$h mkdir -p '$HOME/kube' && scp -r etcd* user@$h:~/kube; done
for h in master node1 node2 node3 node4; do ssh user@$h 'sudo mkdir -p /opt/bin && sudo mv $HOME/kube/* /opt/bin && rm -rf $home/kube/*'; done
上面的代碼要實現的目的就是到github上下載壓縮包,然後scp到各個主機節點。所以你可以手動執行上面的操作。
手動到github上下載etcd release (https://github.com/etcd-io/etcd/releases) 的.tar.gz包,解壓。通過scp複製 etcd 和etcdctl到各個主機(每臺主機需要配置ssh)。然後複製到/opt/bin目錄下。
root@localhost:/opt/bin# ls
Documentation etcd etcdctl README-etcdctl.md README.md READMEv2-etcdctl.md
配置etcd服務
在每臺主機上,分別創建/opt/config/etcd.conf和/lib/systemd/system/etcd.service文件,(注意修改IP地址,和主機名)
/opt/config/etcd.conf
sudo mkdir -p /var/lib/etcd/
sudo mkdir -p /opt/config/
sudo cat <<EOF | sudo tee /opt/config/etcd.conf
ETCD_DATA_DIR=/var/lib/etcd
ETCD_NAME=etcd5
ETCD_INITIAL_CLUSTER=etcd5=http://10.107.20.5:2380,etcd6=http://10.107.20.6:2380,etcd7=http://10.107.20.7:2380,etcd8=http://10.107.20.8:2380,etcd9=http://10.107.20.9:2380
ETCD_INITIAL_CLUSTER_STATE=new
ETCD_LISTEN_PEER_URLS=http://10.107.20.5:2380
ETCD_INITIAL_ADVERTISE_PEER_URLS=http://10.107.20.5:2380
ETCD_ADVERTISE_CLIENT_URLS=http://10.107.20.5:2379
ETCD_LISTEN_CLIENT_URLS=http://10.107.20.5:2379,http://127.0.0.1:2379
GOMAXPROCS=$(nproc)
EOF
此處五臺主機的ETCD_NAME爲etcd 5-9,可修改ETCD_NAME爲自己起得名字(相應的ETCD_INITIAL_CLUSTER中對應五個名字)。每臺主機上修改ETCD_LISTEN_PEER_URLS、ETCD_INITIAL_ADVERTISE_PEER_URLS、ETCD_ADVERTISE_CLIENT_URLS、ETCD_LISTEN_CLIENT_URLS爲本機的ip。
/lib/systemd/system/etcd.service
[Unit]
Description=Etcd Server
Documentation=https://github.com/coreos/etcd
After=network.target
[Service]
User=root
Type=simple
EnvironmentFile=-/opt/config/etcd.conf
ExecStart=/opt/bin/etcd
Restart=on-failure
RestartSec=10s
LimitNOFILE=40000
[Install]
WantedBy=multi-user.target
然後在每臺主機上運行如下命令,將etcd加入開機服務並啓動
sudo systemctl daemon-reload
sudo systemctl enable etcd
sudo systemctl start etcd
部署K8s Master
下載Flannel
FLANNEL_VERSION=${FLANNEL_VERSION:-"v0.7.0"}
curl -L https://github.com/coreos/flannel/releases/download/v${FLANNEL_VERSION}/flannel-${FLANNEL_VERSION}-linux-amd64.tar.gz flannel.tar.gz
tar xzf flannel.tar.gz -C /tmp
如etcd一般,可手動到github上下載,解壓到/tmp。 https://github.com/coreos/flannel/releases