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.cnhtml

http://etcd02.firstshare.cn前端

node

172.31.101.172
172.31.101.173
172.31.101.174 node

8G內存
8核CPU linux

kubelet、kube-proxy、docker、flannel  
node

172.31.101.115
172.31.101.116
172.31.101.117 nginx

32G內存
8核CPU git

kubelet、kube-proxy、docker、flannel  

master節點能夠不安裝 docker的,可是須要安裝flannel,不然一些轉發請求很差使。github

 

機器初始化

採用CentOS 7系統,線下的yum.repos.d的配置和線上不同,致使安裝的一些軟件不是最新的。須要作以下操做:docker

獨立的數據盤 /data 必須是ext4格式的,不然會有問題json

  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

相關文章
相關標籤/搜索