手動安裝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就是都裝
首先,環境準備
下載kubernetes安裝包(這裡是下載1.6的版本)
然後解壓縮
再把所有的binary複製到kube-bin下
建立所需的資料夾
MASTER
-------------------------------------------------------------------
kube-apiserver 設定檔(Master)
* ${1} 是master ip
kube-controller-manager 設定檔(Master)
* ${1} 是master ip
kube-scheduler 設定檔(Master)
* ${1} 是master ip
etcd 設定檔(Master)
* ${1} 是master ip
* ${2} 是etcd cluster的state,打'new'就對了。(除非你要架設etcd cluster)
* ${3} 是etcd cluster的名稱,隨便打即可。eg: 'master'
flannel 設定檔(Master/Minion)
* ${1} 是master ip
* ${2} 是現在這台電腦的ip(master的話就跟${1}一樣,如果是在node上,就要打node ip)
MINION/NODE
------------------------------------------------------------------
kubelet 設定檔 (Minion)
* ${1} 是master ip
* ${2} 是現在這台電腦的ip
kube-proxy 設定檔(Minion)
* ${1} 是master ip
* ${2} 是現在這台電腦的ip
docker 設定檔(Minion)
* <INSEC_REGISTER> 是private docker registry的ip,如果不知道是什麼,可以隨便填一個ip
* <FLANNEL_SUBNET> 這個有點複雜,先留著,不要動
還有flannel喔! 請參照上面的設定
環境:
- 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/
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
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
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
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
* ${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
* ${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
* ${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
* ${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
* <FLANNEL_SUBNET> 這個有點複雜,先留著,不要動
還有flannel喔! 請參照上面的設定
留言
張貼留言