手動安裝Kubernetes(一)設定檔

本文適合完全沒有基礎的新手,指令只要複製、貼上即可運作
環境:
  - Ubuntu 16.04 
  - Kubernetes 1.6
  - Docker 1.12.6

前陣子開始接觸Kubernetes,網路上有不少詳細的介紹安裝的文章,不過總都是會有些小問題,在過程中遇到了不少困難,留個紀錄。不是最好的設定,但是是可以動的設定,如果有人有一樣的需求,也希望能幫得上忙。

目前知道安裝Kubernetes大概有
1. 下載安裝包,手動自己裝
2. kubeadm(官方提供,可以安裝,升級的工具)
3. 使用 Ansible(非官方的deploy工具)
以下要分享的是手動安裝的過程

Kubernetes有分master 跟 minion(或稱node)兩種角色,分別有以下程式
Master:
  - kube-apiserver
  - kube-scheduler
  - kube-controller-manager
(以上三個是kubernetes master的主體)
  - etcd(key-value DB)
  - flannel (負責網路)
Minion/Node
  - kubelet
  - kube-proxy
(以上兩個是kubernetes node的主要程式)
  - flannel(負責網路)
  - docker(沒有他,kubernetes是要管誰 XD)
不過,一般來說,master的機器上也會當minion,所以master就是都裝

首先,環境準備
  apt-get update
  apt-get install ssh
  apt-get install curl

下載kubernetes安裝包(這裡是下載1.6的版本)
  wget https://github.com/GoogleCloudPlatform/kubernetes/releases/download/v1.6.0/kubernetes.tar.gz

然後解壓縮
  tar -xvf kubernetes.tar.gz
  cd kubernetes/cluster/ubuntu
  bash download-release.sh

再把所有的binary複製到kube-bin下
  mkdir ~/kube-bin
  cp binaries/kubectl ~/kube-bin/
  cp binaries/master/* ~/kube-bin/ 
  cp binaries/minion/* ~/kube-bin/

建立所需的資料夾
  mkdir /opt/bin/
  mkdir /opt/config/
  mkdir /root/.kube/
  mkdir /srv/kubernetes -p
  mkdir /var/log/kubernetes
  mkdir /usr/local/bin/ -p


MASTER
-------------------------------------------------------------------
kube-apiserver 設定檔(Master)
cat <<EOF | tee /lib/systemd/system/kube-apiserver.service
[Unit]
Description=Kubernetes API Server
Documentation=https://github.com/kubernetes/kubernetes
After=network.target
Requires=docker.service
After=docker.service


[Service]
User=root
ExecStart=/opt/bin/kube-apiserver\
 --insecure-bind-address=0.0.0.0\
 --insecure-port=8080\
 --etcd-servers=http://${1}:2379\
 --logtostderr=false\
 --allow-privileged=false\
 --service-cluster-ip-range=172.112.0.0/16\
 --admission-control=NamespaceLifecycle,ServiceAccount,LimitRanger,SecurityContextDeny,ResourceQuota\
 --service-node-port-range=30000-32767\
 --advertise-address=${1}\
 --v=6\
 --storage-backend="etcd2"\
 --log-dir="/var/log/kubernetes"\
 --client-ca-file=/srv/kubernetes/ca.crt\
 --tls-private-key-file=/srv/kubernetes/server.key\
 --tls-cert-file=/srv/kubernetes/server.cert\
 --service_account_key_file=/srv/kubernetes/server.key\
 --secure-port=6443
Restart=on-failure
Type=notify
LimitNOFILE=65536


[Install]
WantedBy=multi-user.target
EOF
${1} 是master ip

kube-controller-manager 設定檔(Master)
cat <<EOF | tee /lib/systemd/system/kube-controller-manager.service
[Unit]
Description=Kubernetes Controller Manager
Documentation=https://github.com/kubernetes/kubernetes
Requires=kube-apiserver.service
After=kube-apiserver.service


[Service]
User=root
ExecStart=/opt/bin/kube-controller-manager\
  --master=${1}:8080\
  --root-ca-file=/srv/kubernetes/ca.crt\
  --service-account-private-key-file=/srv/kubernetes/server.key\
  --horizontal-pod-autoscaler-sync-period=${autoscaling_sync_period}\
  --logtostderr=false\
  --log-dir="/var/log/kubernetes"\
  --v=3
Restart=on-failure
LimitNOFILE=65536


[Install]
WantedBy=multi-user.target
EOF
${1} 是master ip

kube-scheduler 設定檔(Master)
echo "create /lib/systemd/system/kube-scheduler.service"
cat <<EOF | tee /lib/systemd/system/kube-scheduler.service
[Unit]
Description=Kubernetes Scheduler
Documentation=https://github.com/kubernetes/kubernetes
Requires=kube-apiserver.service
After=kube-apiserver.service


[Service]
User=root
ExecStart=/opt/bin/kube-scheduler \
  --logtostderr=true \
  --master=${1}:8080
Restart=on-failure
LimitNOFILE=65536


[Install]
WantedBy=multi-user.target
EOF
${1} 是master ip

etcd 設定檔(Master)
cat <<EOF | tee /opt/config/etcd.conf
ETCD_DATA_DIR=/opt/etcd
ETCD_NAME=${3}
ETCD_INITIAL_CLUSTER=${3}=http://${1}:2380
ETCD_LISTEN_PEER_URLS=http://${1}:2380
ETCD_INITIAL_ADVERTISE_PEER_URLS=http://${1}:2380
ETCD_ADVERTISE_CLIENT_URLS=http://${1}:2379
ETCD_LISTEN_CLIENT_URLS=http://${1}:2379,http://127.0.0.1:4001, http://${1}:4001, http://127.0.0.1:2379
ETCD_INITIAL_CLUSTER_STATE=${2}
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
GOMAXPROCS=$(nproc)
EOF


cat <<EOF | tee /lib/systemd/system/etcd.service
[Unit]
Description=Etcd Server
Documentation=https://github.com/coreos/etcd
After=network.target
Before=flanneld.service


[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
EOF
${1} 是master ip
${2} 是etcd cluster的state,打'new'就對了。(除非你要架設etcd cluster)
${3} 是etcd cluster的名稱,隨便打即可。eg: 'master'

flannel 設定檔(Master/Minion)
cat <<EOF | tee /lib/systemd/system/flanneld.service
[Unit]
Description=Flanneld
Documentation=https://github.com/coreos/flannel
After=network.target
Requires=network.target
Before=docker.service


[Service]
User=root
ExecStart=/opt/bin/flanneld\
  --etcd-endpoints="http://${1}:2379"\
  --iface=${2}\
  --ip-masq
Restart=on-failure
Type=notify
LimitNOFILE=65536


[Install]
WantedBy=multi-user.target
EOF
${1} 是master ip
${2} 現在這台電腦的ip(master的話就跟${1}一樣,如果是在node上,就要打node ip)


MINION/NODE
------------------------------------------------------------------
kubelet 設定檔 (Minion)
cat <<EOF | tee /lib/systemd/system/kubelet.service
[Unit]
Description=Kubernetes Kubelet
After=docker.service
Requires=docker.service


[Service]
ExecStart=/opt/bin/kubelet\
  --hostname-override=${2}\
  --api-servers=http://${1}:8080\
  --register-node=true\
  --logtostderr=false\
  --log-dir="/var/log/kubernetes"\
  --v=3\
  --cluster_dns=172.112.0.22\
  --cluster_domain=cluster.local
Restart=on-failure
KillMode=process


[Install]
WantedBy=multi-user.target
EOF
${1} 是master ip
${2} 現在這台電腦的ip

kube-proxy 設定檔(Minion)
cat <<EOF | tee /lib/systemd/system/kube-proxy.service
[Unit]
Description=Kubernetes Proxy
After=network.target
Requires=network.target


[Service]
ExecStart=/opt/bin/kube-proxy  \
  --hostname-override=${2} \
  --master=http://${1}:8080 \
  --logtostderr=true
Restart=on-failure


[Install]
WantedBy=multi-user.target
EOF
${1} 是master ip
${2} 現在這台電腦的ip

docker 設定檔(Minion)
cat <<EOF | tee /lib/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
After=network.target docker.socket
Requires=network.target


[Service]
Type=notify
ExecStart=/usr/bin/dockerd --insecure-registry=<INSEC_REGISTER> --bip=<FLANNEL_SUBNET>/24 --mtu=1450
ExecReload=/bin/kill -s HUP $MAINPID
# Having non-zero Limit*s causes performance problems due to accounting overhead
# in the kernel. We recommend using cgroups to do container-local accounting.
LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
# Uncomment TasksMax if your systemd version supports it.
# Only systemd 226 and above support this version.
#TasksMax=infinity
TimeoutStartSec=0
# set delegate yes so that systemd does not reset the cgroups of docker containers
Delegate=yes
# kill only the docker process, not all processes in the cgroup
KillMode=process


[Install]
WantedBy=multi-user.target
EOF
* <INSEC_REGISTER> 是private docker registry的ip,如果不知道是什麼,可以隨便填一個ip
* <FLANNEL_SUBNET> 這個有點複雜,先留著,不要動

還有flannel喔! 請參照上面的設定


文章有點長,這篇就先介紹設定檔的部分囉!
下篇:手動安裝Kubernetes(二)啟動服務
 

留言

這個網誌中的熱門文章

What's New in Ethereum Serenity (2.0)

瑞士滑雪分享2 - 策馬特

動手實做零知識 - circom