#! /bin/bash

# 在centos7上手动安装k8s1.9.9参考

# 二进制软件下载地址:https://github.com/coreos/etcd/releases #https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.9.md

# https://github.com/coreos/etcd/releases

# 本次采用master-worker一个主节点和一个工作节点 master:192.168.29.102 #worker:192.168.29.103

# 对于基础环境,比如配置本地yum、关闭防火墙或者开放相关端口、SELINUX这些事先需要准备好。

# master 都是用的root权限,所以没注意权限的问题

# etcd需要采用奇数个节点,因需通过选举产升leader


# 1、下载文件

mkdir /data && cd /data

wget https://github.com/coreos/etcd/releases/download/v3.3.9/etcd-v3.3.9-linux-amd64.tar.gz # master

wget https://dl.k8s.io/v1.9.9/kubernetes-server-linux-amd64.tar.gz #master

# wget https://dl.k8s.io/v1.9.9/kubernetes-node-linux-amd64.tar.gz # worker


# 2、解压etcd并移动文件

tar -zxvf etcd-v3.3.9-linux-amd64.tar.gz && etcd-v3.3.9-linux-amd64

mv etcd* /usr/bin


# 3、etcd配置文件

mkdir /etc/etcd

cat <<EOF >>/etc/etcd/etcd.conf

ETCD_NAME=ansible-k8s2

ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"

ETCD_DATA_DIR="/var/lib/etcd/"

ETCD_ADVERTISE_CLIENT_URLS="http://192.168.29.102:2379"

EOF


# 4、解压k8s文件并移动文件至/usr/bin

tar -zxvf kubernetes-server-linux-amd64.tar.gz && cd  kubernetes/server/bin/

mv kube-apiserver kube-controller-manager kube-scheduler kube-proxy kubelet kubectl /usr/bin


# 5、k8s相关配置文件

mkdir /etc/kubernetes && cd /etc/kubernetes

# apiserver

cat <<EOF >>apiserver

#

# The following values are used to configure the kube-apiserver

#

# The address on the local server to listen to.

#KUBE_API_ADDRESS="--address=0.0.0.0"

KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"

# The port on the local server to listen on.

KUBE_API_PORT="--port=8080"

# Port minions listen on

#KUBELET_PORT="--kubelet-port=10250"

# Comma separated list of nodes in the etcd cluster

KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.29.102:2379"

# Address range to use for services

KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=192.168.4.0/24"

# default admission control policies

KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,ResourceQuota"

# Add your own!

KUBE_API_ARGS=""

EOF

# config

cat <<EOF >>config

KUBE_LOGTOSTDERR="--logtostderr=true"

KUBE_LOG_LEVEL="--v=0"

KUBE_ALLOW_PRIV="--allow-privileged=false"

KUBE_MASTER="--master=http://192.168.29.102:8080"

EOF

# controller-manager

cat <<EOF >>controller-manager

KUBE_CONTROLLER_MANAGER_ARGS=""

EOF

# scheduler

cat <<EOF >>scheduler

KUBE_SCHEDULER_ARGS=""

EOF


# 6、etcd k8s 启动文件

# etcd

cat <<EOF >>/lib/systemd/system/etcd.service

[Unit]

Description=Etcd Server

Documentation=https://github.com/coreos/etcd

After=network.target

[Service]

User=root

Type=notify

EnvironmentFile=-/etc/etcd/etcd.conf

ExecStart=/usr/bin/etcd

Restart=on-failure

RestartSec=10s

LimitNOFILE=40000

[Install]

WantedBy=multi-user.target

EOF


# apiserver

cat <<EOF >>/lib/systemd/system/kube-apiserver.service

[Unit]

Description=Kubernetes API Server

Documentation=https://github.com/GoogleCloudPlatform/kubernetes

After=network.target

After=etcd.service

Wants=etcd.service

[Service]

User=root

EnvironmentFile=-/etc/kubernetes/config

EnvironmentFile=-/etc/kubernetes/apiserver

ExecStart=/usr/bin/kube-apiserver \

        $KUBE_LOGTOSTDERR \

        $KUBE_LOG_LEVEL \

        $KUBE_ETCD_SERVERS \

        $KUBE_API_ADDRESS \

        $KUBE_API_PORT \

        $KUBELET_PORT \

        $KUBE_ALLOW_PRIV \

        $KUBE_SERVICE_ADDRESSES \

        $KUBE_ADMISSION_CONTROL \

        $KUBE_API_ARGS

Restart=on-failure

Type=notify

LimitNOFILE=65536

[Install]

WantedBy=multi-user.target

EOF


# controller-manager

cat <<EOF >>/lib/systemd/system/kube-controller-manager.service

[Unit]

Description=Kubernetes Controller Manager

Documentation=https://github.com/GoogleCloudPlatform/kubernetes

After=etcd.service

After=kube-apiserver.service

Requires=etcd.service

Requires=kube-apiserver.service

[Service]

User=root

EnvironmentFile=-/etc/kubernetes/config

EnvironmentFile=-/etc/kubernetes/controller-manager

ExecStart=/usr/bin/kube-controller-manager \

        $KUBE_LOGTOSTDERR \

        $KUBE_LOG_LEVEL \

        $KUBE_MASTER \

        $KUBE_CONTROLLER_MANAGER_ARGS

Restart=on-failure

LimitNOFILE=65536

[Install]

WantedBy=multi-user.target

EOF


# scheduler

cat <<EOF >>/lib/systemd/system/kube-scheduler.service

[Unit]

Description=Kubernetes Scheduler

Documentation=https://github.com/kubernetes/kubernetes

[Service]

User=root

EnvironmentFile=-/etc/kubernetes/config

EnvironmentFile=-/etc/kubernetes/scheduler

ExecStart=/usr/bin/kube-scheduler \

        $KUBE_LOGTOSTDERR \

        $KUBE_MASTER

Restart=on-failure

LimitNOFILE=65536

[Install]

WantedBy=multi-user.target

EOF


# 7、开启启动

systemctl daemon-reload

for service in etcd.service kube-apiserver.service kube-controller-manager.service kube-scheduler.service; 

do systemctl enable $service; 

done


# 8、启动并查看状态

for service in etcd.service kube-apiserver.service kube-controller-manager.service kube-scheduler.service; 

do systemctl start $service; 

done

for service in etcd.service kube-apiserver.service kube-controller-manager.service kube-scheduler.service; 

do systemctl status $service; 

done



# worker

# 1、下载、解压并移动文件

wget wget https://dl.k8s.io/v1.9.9/kubernetes-node-linux-amd64.tar.gz

tar -zxvf kubernetes-node-linux-amd64.tar.gz && cd cd kubernetes/node/bin/

mv kube* /usr/bin


# 2、配置文件

# config

mkdir -p /etc/kubernetes  && cd /etc/kubernetes

cat <<EOF >>config

KUBE_LOGTOSTDERR="--logtostderr=true"

KUBE_LOG_LEVEL="--v=3"

KUBE_ALLOW_PRIV="--allow-privileged=false"

#KUBE_MASTER="--master=http://192.168.29.102:8080" 版本不支持了

EOF

#kubeconfig

mkdir /var/lib/kubelet

cat <<EOF >>/var/lib/kubelet/kubeconfig

apiVersion: v1

kind: Config

users:

- name: kubelet

clusters:

- name: kubernetes

  cluster:

    server: http://192.168.29.102:8080

contexts:

- context:

    cluster: kubernetes

    user: kubelet

  name: service-account-context

current-context: service-account-context

EOF


# kubelet

cat <<EOF >>kubelet

#KUBELET_ADDRESS="--address=127.0.0.1"

KUBELET_HOSTNAME="--hostname-override=192.168.29.103"

#KUBELET_API_SERVER="--api-servers=http://192.168.29.102:8080"

# pod infrastructure container

KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"

KUBELET_ARGS="--enable-server=true --enable-debugging-handlers=true --fail-swap-on=false --kubeconfig=/var/lib/kubelet/kubeconfig"

EOF


# proxy

cat <<EOF >>proxy

KUBE_PROXY_ARGS=""

EOF


# 3、启动文件

cat <<EOF >>/lib/systemd/system/kubelet.service

[Unit]

Description=Kubernetes Kubelet

Documentation=https://github.com/GoogleCloudPlatform/kubernetes

After=docker.service #

Requires=docker.service # 先安装docker启动了再启动worker

[Service]

WorkingDirectory=/var/lib/kubelet

EnvironmentFile=-/etc/kubernetes/config

EnvironmentFile=-/etc/kubernetes/kubelet

ExecStart=/usr/bin/kubelet \

        $KUBE_LOGTOSTDERR \

        $KUBE_LOG_LEVEL \

        $KUBELET_API_SERVER \

        $KUBELET_ADDRESS \

        $KUBELET_PORT \

        $KUBELET_HOSTNAME \

        $KUBE_ALLOW_PRIV \

        $KUBELET_POD_INFRA_CONTAINER \

        $KUBELET_ARGS

Restart=on-failure

KillMode=process

[Install]

WantedBy=multi-user.target

EOF


#proxy

cat <<EOF >>/lib/systemd/system/kube-proxy.service

[Unit]

Description=Kubernetes Proxy

Documentation=https://github.com/GoogleCloudPlatform/kubernetes

After=network.target

[Service]

EnvironmentFile=-/etc/kubernetes/config

EnvironmentFile=-/etc/kubernetes/proxy

ExecStart=/usr/bin/kube-proxy \

        $KUBE_LOGTOSTDERR \

        $KUBE_LOG_LEVEL \

        $KUBE_MASTER \

        $KUBE_PROXY_ARGS

Restart=on-failure

LimitNOFILE=65536

[Install]

WantedBy=multi-user.target

EOF


# 4、安装docker 我是通过rpm安装的 最好通过yum安装,不用管依赖的问题

cd /data/

yum -y install container-selinux libcgroup libltdl.so.7 pigz libtool-ltdl

rpm -ivh docker-ce-18.03.1.ce-1.el7.centos.x86_64.rpm --nodeps #可能涉及到依赖问题

# 5、开机启动

systemctl daemon-reload

for service in docker.service kube-proxy.service kubelet.service; 

do systemctl enable $service; 

done

# 6、启动worker

for service in docker.service kube-proxy.service kubelet.service; 

do systemctl start $service; 

done


# 在master上检查

[root@ansible-k8s2 system]# kubectl get nodes

NAME             STATUS    ROLES     AGE       VERSION

192.168.29.103   Ready     <none>    16h       v1.9.9

[root@ansible-k8s2 system]# kubectl get cs

NAME                 STATUS    MESSAGE             ERROR

controller-manager   Healthy   ok

etcd-0               Healthy   {"health":"true"}

scheduler            Healthy   ok


# 注意:如果执行kubectl提示cannot excute binary file 这是下载的文件在解压后出现的问题,我这边是重新解压再移动就可以了

github地址:https://github.com/chances-for-those-who-have-prepared/study/blob/master/k8s/install_k8s_by_manual

如有问题,可在github地址:https://github.com/chances-for-those-who-have-prepared/study/issues说明