kubernetes邏輯部署圖
機器列表
模塊
|
機器
|
配置
|
備注
|
域名
|
---|---|---|---|---|
master | 172.31.101.175 172.31.101.176 172.31.101.177 |
4G內存 4核CPU |
etcd、kube-apiserver、kube-scheduler、kube-controller-manager、flannel | |
node | 172.31.101.172 |
8G內存 |
kubelet、kube-proxy、docker、flannel | |
node | 172.31.101.115 |
32G內存 |
kubelet、kube-proxy、docker、flannel |
master節點可以不安裝 docker的,但是需要安裝flannel,否則一些轉發請求不好使。
機器初始化
采用CentOS 7系統,線下的yum.repos.d的配置和線上不一樣,導致安裝的一些軟件不是最新的。需要做如下操作:
獨立的數據盤 /data 必須是ext4格式的,否則會有問題
- 同步172.31.101.166:/etc/yum.repos.d/* 到 本機 /etc/yum.repos.d/ 目錄下
- 運行 echo 'overlay' > /etc/modules-load.d/overlay.conf 啟用overlay的模塊支持
- 運行 yum -y update 命令等待更新系統
- 運行 yum -y install flannel docker 安裝docker 程序
- 運行 yum -y install lrzsz telnet strace bridge_utils 等工具方便后續定位問題
- 運行 yum -y install ceph-common 組件
- 運行 pip install docker-compose 組件
- 運行 systemctl enable docker 把docker放到開機自啟動中
升級內核到最新4.x的版本,匹配ceph分布式存儲的要求- 運行 reboot 命令,重啟系統
升級centos7的內核到4.9
rpm --
import
https:
//www
.elrepo.org
/RPM-GPG-KEY-elrepo
.org
rpm -Uvh http:
//www
.elrepo.org
/elrepo-release-7
.0-2.el7.elrepo.noarch.rpm
yum -y
install
yum-plugin-fastestmirror
yum -y --enablerepo=elrepo-kernel
install
kernel-ml
grub2-
set
-default 0
|
升級到4.x版本之后,和systemd/kubelet/docker的配合有問題,暫時先回退到3.x
docker設置
使用阿里鏡像加速
cat
/etc/docker/daemon
.json
{
"storage-driver"
:
"overlay"
,
"live-restore"
:
true
,
}
|
將設備目錄等放到/data盤,避免撐爆根目錄
# docker相關信息會存儲在 /var/lib/docker 下
mv
/var/lib/docker
/data/
ln
-sf
/data/docker
/var/lib/docker
# pod相關信息會存儲在 /var/lib/kubelet 下,如果沒有這個目錄,請先創建
mv
/var/lib/kubelet
/data/
ln
-sf
/data/kubelet
/var/lib/kubelet
|
配置允許使用http方式訪問harbor倉庫
修改 /etc/sysconfig/docker 文件
OPTIONS='--selinux-enabled --log-driver=journald --signature-verification=false'
INSECURE_REGISTRY='--insecure-registry reg.firstshare.cn'
配置后重新加載
- systemctl daemon-reload
- systemctl restart docker
安裝kubernetes
關閉防火牆
由於master和node之間有頻繁的網絡操作,而且在內網使用,所以關閉防火牆,避免影響效率
- systemctl disable firewalld 去掉開機自啟動
- systemctl stop firewalld 停止防火牆服務
- setenforce 0 關閉SElinux
安裝etcd cluster
yum -y install etcd,目前版本是3.1.0.
配置參考文檔: https://coreos.com/etcd/docs/3.1.4/op-guide/clustering.html
|
位置
|
備注
|
---|---|---|
機器 | 172.31.101.175/176/177 | 至少3台構成一個cluster,通過 http://etcd02.firstshare.cn 訪問 |
配置 | /etc/etcd/etcd.conf | |
數據 | /data/etcd-storage | 需要修改為 etcd 賬戶可讀寫 |
服務 | /usr/lib/systemd/system/etcd.service | |
賬戶 | etcd | 不用root賬戶啟動 |
自啟動 | systemctl enable etcd | 重啟后自動運行etcd |
備份 | ||
監控 |
etcd配置
172.31.101.175
|
172.31.101.176
|
172.31.101.177
|
---|---|---|
ETCD_NAME=vlnx101175 |
ETCD_NAME=vlnx101176 |
ETCD_NAME=vlnx101177 |
驗證etcd是否正常
運行命令 etcdctl cluster-health 檢查是否工作正常
安裝master
准備好tls認證文件
從老的k8s集群172.31.101.119:/key1 目錄拷貝證書等文件到所有的master節點的 /etc/kubernetes/ssl/ 目錄下。配置說明如下
文件名
|
說明
|
---|---|
basic_auth.csv | basic auth user and password |
ca.crt | Certificate Authority cert |
known_tokens.csv | tokens that entities (e.g. the kubelet) can use to talk to the apiserver |
kubecfg.crt | Client certificate, public key |
kubecfg.key | Client certificate, private key |
server.cert | Server certificate, public key |
server.key | Server certificate, private key |
通過yum安裝
運行 yum -y install kubernetes-master 命令,目前安裝的是1.5.2,我們先用它把service相關的東西都配置好,然后手動升級到1.6.0的最新版本。
可以通過rpm -ql kubernetes-master 來看都安裝了哪些文件
修改master配置文件
到 /etc/kubernetes/ 目錄下修改配置
文件名
|
內容
|
備注
|
---|---|---|
文件名
|
內容
|
備注
|
config | KUBE_LOGTOSTDERR="--logtostderr=true" |
|
apiserver | KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0" |
支持ssl/bash/token等安全認證 |
controller-manager | KUBE_CONTROLLER_MANAGER_ARGS="--leader-elect=true \ |
必須設置認證方式,否則創建deploy的時候會報錯: |
scheduler | KUBE_SCHEDULER_ARGS="--leader-elect=true \ |
配置開機自啟動
systemctl daemon-reload
systemctl
enable
kube-apiserver
systemctl
enable
kube-scheduler
systemctl
enable
kube-controller-manager
|
啟動master相關服務
systemctl start kube-apiserver
systemctl start kube-scheduler
systemctl start kube-controller-manager
|
驗證組件是否正常
運行命令 kubectl get componentstatuses 檢查組件是否正常
apiserver 是無狀態的,所以對於多個節點而言可以通過前端擋一層 nginx 、haproxy 等實現高可用和負載均衡,而對於 scheduler 和 controller-managere 而言,它們需要操作后端存儲 etcd,是有狀態的,為了減少同步操作后端存儲帶來的數據不一致性,3 個 節點 的scheduler 和 controller-manager 組件同時只有一個提供服務,具體的實現就是3個節點之間會進行一個 leader 的選舉,只有 leader 節點才提供服務。因此,驗證選舉工作是否正常也是非常重要的。
查看當前 3 個 shcduler和controller-manager 哪個是 leader 節點:
kubectl get endpoints kube-controller-manager --namespace=kube-system -o yaml
升級新版本
下載路徑:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG.md#downloads-for-v160
到上面路徑下載 kubernetes-server-linux-amd64.tar.gz 文件,然后上傳到服務器上,解壓縮到 /opt/fs/kubernetes 目錄,把 bin 目錄的文件復制到 系統 /bin/ 目錄下。
注意事項:
- 需要修改可執行權限:chmod a+x /bin/kube* , 這里比較坑,否則會報沒有可執行權限的錯誤,無法啟動。
- 刪除 /var/run/kubernetes/apiserver* 下產生的文件,否則無法啟動
然后重啟master相關服務就可以了
安裝node
運行 yum -y install kubernetes-node 命令,目前安裝的是1.5.2,我們先用它把service相關的東西都配置好,然后手動升級到1.6.0的最新版本。
安裝flanneld(注意:各個master節點上也需要安裝並啟動flannel,配置和下面的相同)
yum -y
install
flannel
systemctl daemon-reload
systemctl
enable
flanneld
systemctl start flanneld
|
修改flannel配置文件
修改 /etc/sysconfig/flanneld 配置文件,配置etcd的地址
FLANNEL_ETCD_ENDPOINTS="http://172.31.101.175:2379,http://172.31.101.176:2379,http://172.31.101.177:2379"
FLANNEL_ETCD_PREFIX="/atomic.io/network"
在master的機器上,修改etcd設置flannel的網段。 (SubnetLen指定分配給每個Node節點上Pod網絡的掩碼位數,從而在網絡上間接決定了每個node上可運行的pod數,參考文檔;https://github.com/coreos/flannel/blob/master/Documentation/configuration.md)
etcdctl set /atomic.io/network/config '{ "Network": "10.132.0.0/16","SubnetLen":24 }'
這樣每個node節點上的flanneld啟動的時候,會自動分配對應網段的地址並注冊到etcd中。
修改docker配置去掉bip的設置
在啟動flannel后,每個node節點的bip范圍是自動分配的,不需要再docker的配置文件中指明。
修改docker的配置文件,指明cgroup用systemd
OPTIONS='--selinux-enabled=false --log-driver=journald --signature-verification=false'
if [ -z "${DOCKER_CERT_PATH}" ]; then
DOCKER_CERT_PATH=/etc/docker
fi
INSECURE_REGISTRY='--insecure-registry reg.firstshare.cn'
|
flannel網絡機制
經由所在主機的docker0虛擬網卡轉發到flannel0虛擬網卡,這是個P2P的虛擬網卡,flanneld服務監聽在網卡的另外一端。
Flannel通過Etcd服務維護了一張節點間的路由表。
修改node配置文件
到 /etc/kubernetes/ 目錄下修改配置
文件名
|
內容
|
備注
|
---|---|---|
config | KUBE_LOGTOSTDERR="--logtostderr=true" |
不需要配置override-hostname,直接使用本機hostname就可以了 |
kubelet | KUBELET_ADDRESS="--address=0.0.0.0" KUBELET_API_SERVER="--kubeconfig=/var/lib/kubelet/kubeconfig" KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest" KUBELET_ARGS="--cgroup-driver=systemd --require-kubeconfig --cluster_dns=10.137.254.254 --cluster_domain=cluster.local" |
必須配置cgroup-driver=systemd,否則無法啟動 注釋KUBELET_HOSTNAME配置或者修改值為node的真實hostname, 否則master上 kubectl get node只會顯示一個127.0.0.1 |
proxy | KUBE_PROXY_ARGS="" | |
kubeconfig | apiVersion: v1 |
/var/lib/kubelet/kubeconfig |
配置啟動依賴順序
- docker要在flanneld之后啟動
- kublet要在flanneld和docker之后啟動
cat /usr/lib/systemd/system/docker.service
cat /usr/lib/systemd/system/kubelet.service
配置開機自啟動
systemctl daemon-reload
systemctl
enable
flanneld
systemctl
enable
docker
systemctl
enable
kube-proxy
systemctl
enable
kubelet
|
啟動node相關服務
systemctl start flanneld
systemctl start docker
systemctl start kube-proxy
systemctl start kubelet
|
升級新版本
下載路徑:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG.md#downloads-for-v160
到上面路徑下載 kubernetes-server-linux-amd64.tar.gz 文件,然后上傳到服務器上,解壓縮到 /opt/fs/kubernetes 目錄,把 bin 目錄的文件復制到 系統 /bin/ 目錄下。
注意事項:
- 需要修改可執行權限:chmod a+x /bin/kube* , 這里比較坑,否則會報沒有可執行權限的錯誤,無法啟動。
然后重啟node相關服務就可以了
檢查node是否正常
在 master 節點上,運行命令 kubectl get node ,如果顯示node為 NotReady, 則把所有node節點都重啟reboot一下才可能恢復正常。
參考資料
kubernetes 1.6.0 高可靠集群部署 https://www.addops.cn/post/kubernetes-deployment.html
kubernetes + etcd ssl 支持 https://www.addops.cn/post/tls-for-kubernetes-etcd.html
kubernetes 中的服務發現和負載均衡 https://www.addops.cn/post/kubernetes_service_discovery.html
用 Flannel 配置 Kubernetes 網絡 http://dockone.io/article/1186
DockOne技術分享(十八):一篇文章帶你了解Flannel http://dockone.io/article/618
kubernetes 搭建過程中遇到的問題 http://www.cnblogs.com/ivictor/p/4998032.html
CentOS 7 禁用ipv6 http://blog.csdn.net/bluishglc/article/details/41390785
和我一起一步步搭建k8s集群 https://github.com/opsnull/follow-me-install-kubernetes-cluster