kubernetes 安裝手冊


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

http://k8s02.firstshare.cn

http://etcd02.firstshare.cn

node

172.31.101.172
172.31.101.173
172.31.101.174 

8G內存
8核CPU 

kubelet、kube-proxy、docker、flannel  
node

172.31.101.115
172.31.101.116
172.31.101.117 

32G內存
8核CPU 

kubelet、kube-proxy、docker、flannel  

master節點可以不安裝 docker的,但是需要安裝flannel,否則一些轉發請求不好使。

 

機器初始化

采用CentOS 7系統,線下的yum.repos.d的配置和線上不一樣,導致安裝的一些軟件不是最新的。需要做如下操作:

獨立的數據盤 /data 必須是ext4格式的,否則會有問題

  1. 同步172.31.101.166:/etc/yum.repos.d/* 到 本機 /etc/yum.repos.d/ 目錄下
  2. 運行 echo 'overlay' > /etc/modules-load.d/overlay.conf 啟用overlay的模塊支持
  3. 運行 yum -y update 命令等待更新系統
  4. 運行 yum -y install flannel docker 安裝docker 程序
  5. 運行 yum -y install lrzsz telnet strace bridge_utils 等工具方便后續定位問題
  6. 運行 yum -y install ceph-common 組件
  7. 運行 pip install docker-compose 組件
  8. 運行 systemctl enable docker 把docker放到開機自啟動中
  9. 升級內核到最新4.x的版本,匹配ceph分布式存儲的要求
  10. 運行 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 ,
     "registry-mirrors" : [ "https://vbe6ja2b.mirror.aliyuncs.com" ]
}

將設備目錄等放到/data盤,避免撐爆根目錄

調整docker目錄
# 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'

配置后重新加載

  1. systemctl daemon-reload
  2. systemctl restart docker

安裝kubernetes

關閉防火牆

由於master和node之間有頻繁的網絡操作,而且在內網使用,所以關閉防火牆,避免影響效率

  1. systemctl disable firewalld  去掉開機自啟動
  2. systemctl stop firewalld  停止防火牆服務
  3. 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_DATA_DIR="/data/etcd-storage/"
ETCD_HEARTBEAT_INTERVAL="1000"
ETCD_ELECTION_TIMEOUT="10000"
ETCD_LISTEN_PEER_URLS="http://172.31.101.175:2380"
ETCD_LISTEN_CLIENT_URLS="http://172.31.101.175:2379,http://127.0.0.1:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.31.101.175:2380"
ETCD_INITIAL_CLUSTER="vlnx101175=http://172.31.101.175:2380,vlnx101176=http://172.31.101.176:2380,v
lnx101177=http://172.31.101.177:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-k8s"
ETCD_ADVERTISE_CLIENT_URLS="http://172.31.101.175:2379"

ETCD_NAME=vlnx101176
ETCD_DATA_DIR="/data/etcd-storage/"
ETCD_HEARTBEAT_INTERVAL="1000"
ETCD_ELECTION_TIMEOUT="10000"
ETCD_LISTEN_PEER_URLS="http://172.31.101.176:2380"
ETCD_LISTEN_CLIENT_URLS="http://172.31.101.176:2379,http://127.0.0.1:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.31.101.176:2380"
ETCD_INITIAL_CLUSTER="vlnx101175=http://172.31.101.175:2380,vlnx101176=http://172.31.101.176:2380,v
lnx101177=http://172.31.101.177:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-k8s"
ETCD_ADVERTISE_CLIENT_URLS="http://172.31.101.176:2379"

ETCD_NAME=vlnx101177
ETCD_DATA_DIR="/data/etcd-storage/"
ETCD_HEARTBEAT_INTERVAL="1000"
ETCD_ELECTION_TIMEOUT="10000"
ETCD_LISTEN_PEER_URLS="http://172.31.101.177:2380"
ETCD_LISTEN_CLIENT_URLS="http://172.31.101.177:2379,http://127.0.0.1:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.31.101.177:2380"
ETCD_INITIAL_CLUSTER="vlnx101175=http://172.31.101.175:2380,vlnx101176=http://172.31.101.176:2380,v
lnx101177=http://172.31.101.177:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster-k8s"
ETCD_ADVERTISE_CLIENT_URLS="http://172.31.101.177:2379"

驗證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"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=true"
KUBE_MASTER="--master=http://127.0.0.1:8080"

 
apiserver

KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_API_PORT="--insecure-port=8080 --secure-port=6443"
KUBE_ETCD_SERVERS="--etcd-servers=http://127.0.0.1:2379"
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.137.0.0/16"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,LimitRanger,ServiceAccount,ResourceQuota"
KUBE_API_ARGS="--service-node-port-range=80-50000 \
--client-ca-file=/etc/kubernetes/ssl/ca.crt \
--tls-cert-file=/etc/kubernetes/ssl/server.crt \
--tls-private-key-file=/etc/kubernetes/ssl/server.key \
--basic-auth-file=/etc/kubernetes/ssl/basic_auth.csv \
--token-auth-file=/etc/kubernetes/ssl/known_tokens.csv"

支持ssl/bash/token等安全認證
controller-manager

KUBE_CONTROLLER_MANAGER_ARGS="--leader-elect=true \
--leader-elect-lease-duration=150s \
--leader-elect-renew-deadline=100s \
--leader-elect-retry-period=20s \
--root-ca-file=/etc/kubernetes/ssl/ca.crt \
--service-account-private-key-file=/etc/kubernetes/ssl/server.key"

必須設置認證方式,否則創建deploy的時候會報錯:
No API token found for service account "default", retry after the token is automatically created and added to the service account 

scheduler

KUBE_SCHEDULER_ARGS="--leader-elect=true \
--leader-elect-lease-duration=150s \
--leader-elect-renew-deadline=100s \
--leader-elect-retry-period=20s"

 

配置開機自啟動

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/ 目錄下。

注意事項:

  1. 需要修改可執行權限:chmod a+x /bin/kube* , 這里比較坑,否則會報沒有可執行權限的錯誤,無法啟動。
  2. 刪除 /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

/etc/sysconfig/docker
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"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=true"
KUBE_MASTER="--master=http://k8s02.firstshare.cn"

不需要配置override-hostname,直接使用本機hostname就可以了
kubelet

KUBELET_ADDRESS="--address=0.0.0.0"
KUBELET_PORT="–port=10250"

#KUBELET_HOSTNAME="--hostname-override=127.0.0.1"
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
clusters:
- cluster:
insecure-skip-tls-verify: true
server: http://k8s02.firstshare.cn
name: k8s
contexts:
- context:
cluster: k8s
user: ""
name: firstshare
current-context: firstshare
kind: Config
preferences: {}
users: []

/var/lib/kubelet/kubeconfig



配置啟動依賴順序

  1. docker要在flanneld之后啟動
  2. 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/ 目錄下。

注意事項:

  1. 需要修改可執行權限: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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM