>科技>>正文

Ubuntu | 使用kubeadm方式安装kubernetes完整过程

原标题:Ubuntu | 使用kubeadm方式安装kubernetes完整过程

kubernetes v1.8.1集群安装过程中,需要拉取镜像和安装必要的软件,请保证集群内的机器能够访问互联网。

环境准备

本次安装kubernetes集群,配置一台master节点和一台minor节点,ip分配情况如下:

master

k8s-master 172.16.1.X

minor

k8s-minor-1 172.16.1.x

以下操作请在集群内的每台机器上都配置或者确认:

1、配置主机名

hostnamek8s-minor-1

vi/etc/hostname

2、配置hosts

vi/etc/hosts

172.16.1.X k8s-minor-1

172.16.1.x k8s-master

3、防火墙

如果各个主机启用了防火墙,需要开放Kubernetes各个组件所需要的端口,可以查看Installing kubeadm中的”Check required ports”一节。 这里简单起见在各节点禁用防火墙:

sudo ufw disable

sudoufw status

创建/etc/sysctl.d/k8s.conf文件,添加如下内容:

net.bridge.bridge-nf-call-ip6tables = 1

net.bridge.bridge-nf-call-iptables = 1

执行sysctl -p /etc/sysctl.d/k8s.conf使修改生效。

注:这一步执行的时候,可能会因为内核没有加载br_netfilter模块报错:

[root@localhost ~]# sysctl -p /etc/sysctl.d/k8s.conf

sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-ip6tables: No such file or directory

sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-iptables: No such file or directory

解决方法:

[root@localhost ~]# modprobe br_netfilter

4、关闭swap

Kubernetes 1.8开始要求关闭系统的Swap,如果不关闭,默认配置下kubelet将无法启动。可以通过kubelet的启动参数–fail-swap-on=false更改这个限制。 我们这里关闭系统的Swap:

swapoff -a

修改 /etc/fstab 文件,注释掉 SWAP 的自动挂载,使用free -m确认swap已经关闭。

swappiness参数调整,修改/etc/sysctl.d/k8s.conf添加下面一行:

vm.swappiness=0

执行sysctl -p /etc/sysctl.d/k8s.conf使修改生效。

为了在重启后自动执行sysctl命令,需要加入到系统启动脚本中:

vi /etc/profile

在文件最后一行加上

sysctl -p /etc/sysctl.d/k8s.conf

5、配置apt-get的源

为了加速软件安装,可以添加aliyun的源,在/etc/apt/sources.list.d/下增加aliyun.list文件,内容如下

deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse

deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse

deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse

deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse

deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse

deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse

运行sudo apt-get update

软件安装

以下软件请在集群内的每台机器上都进行安装

1、安装Docker

查看可以安装的docker版本

apt-cache policy docker-engine

docker-engine:

Installed: 17.03.1~ce-0~ubuntu-xenial

Candidate: 17.05.0~ce-0~ubuntu-xenial

Version table:

17.05.0~ce-0~ubuntu-xenial 500

500 https://apt.dockerproject.org/repo ubuntu-xenial/main amd64 Packages

17.04.0~ce-0~ubuntu-xenial 500

500 https://apt.dockerproject.org/repo ubuntu-xenial/main amd64 Packages

*** 17.03.1~ce-0~ubuntu-xenial 500

500 https://apt.dockerproject.org/repo ubuntu-xenial/main amd64 Packages

100 /var/lib/dpkg/status

17.03.0~ce-0~ubuntu-xenial 500

500 https://apt.dockerproject.org/repo ubuntu-xenial/main amd64 Packages

1.13.1-0~ubuntu-xenial 500

500 https://apt.dockerproject.org/repo ubuntu-xenial/main amd64 Packages

1.13.0-0~ubuntu-xenial 500

500 https://apt.dockerproject.org/repo ubuntu-xenial/main amd64 Packages

1.12.6-0~ubuntu-xenial 500

500 https://apt.dockerproject.org/repo ubuntu-xenial/main amd64 Packages

1.12.5-0~ubuntu-xenial 500

500 https://apt.dockerproject.org/repo ubuntu-xenial/main amd64 Packages

1.12.4-0~ubuntu-xenial 500

500 https://apt.dockerproject.org/repo ubuntu-xenial/main amd64 Packages

1.12.3-0~xenial 500

500 https://apt.dockerproject.org/repo ubuntu-xenial/main amd64 Packages

1.12.2-0~xenial 500

500 https://apt.dockerproject.org/repo ubuntu-xenial/main amd64 Packages

1.12.1-0~xenial 500

500 https://apt.dockerproject.org/repo ubuntu-xenial/main amd64 Packages

1.12.0-0~xenial 500

500 https://apt.dockerproject.org/repo ubuntu-xenial/main amd64 Packages

1.11.2-0~xenial 500

500 https://apt.dockerproject.org/repo ubuntu-xenial/main amd64 Packages

1.11.1-0~xenial 500

500 https://apt.dockerproject.org/repo ubuntu-xenial/main amd64 Packages

1.11.0-0~xenial 500

500 https://apt.dockerproject.org/repo ubuntu-xenial/main amd64 Packages

目前kubernetes v1.8.1测试过的docker版本是17.03,所以我们这里安装17.03.1~ce-0~ubuntu-xenial版本的docker-engine,安装完后启用docker服务

apt-get install docker-engine=17.03.1~ce-0~ubuntu-xenial

systemctl start docker

systemctl enable docker

Docker从1.13版本开始调整了默认的防火墙规则,禁用了iptables filter表中FOWARD链,这样会引起Kubernetes集群中跨Node的Pod无法通信,在各个Docker节点执行下面的命令:

iptables -P FORWARD ACCEPT

修改docker服务配置

vi /lib/systemd/system/docker.service

增加下面一行配置

ExecStartPost=/sbin/iptables -P FORWARD ACCEPT

配置完毕后,重启docker

systemctl daemon-reload

systemctl restart docker

配置docker加速器

这里采用daocloud的加速器

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://b674067f.m.daocloud.io

2、安装ebtables和socat

kubernetes v1.8.1安装过程中依赖ebtables和socat程序,需要安装

apt-get install ebtables

apt-get install socat

3、安装kubeadm、kubelet、kubectl、kubernetes-cni

请将上述安装包拷贝到集群内的各个节点机器上

安装kubernetes-cni

sudo dpkg -i kubernetes-cni_0.5.1-2_amd64.deb

安装kubectl

sudo dpkg -i kubernetes-cni_0.5.1-2_amd64.deb

安装kubeadm

sudo dpkg -i kubeadm_1.8.1-1_amd64.deb

安装kubelet

sudo dpkg -i kubelet_1.8.1-1_amd64.deb

docker 17.03使用的Cgroup Driver为cgroupfs,而kubelet 1.8.1 使用的cgroup driver为systemd,这里需要修改docker的Cgroup Driver,和kubelet 保持一致!

修改或创建/etc/docker/daemon.json,加入下面的内容:

{

"exec-opts": ["native.cgroupdriver=systemd"]

}

cat /etc/docker/daemon.json

{"registry-mirrors": ["<a href="http://b674067f.m.daocloud.io/" "="" style="text-decoration: none; border-radius: 0px; background: 0px center; border: 0px; bottom: auto; float: none; height: auto; left: auto; line-height: 20px; margin: 0px; outline: 0px; overflow: visible; padding: 0px; position: static; right: auto; top: auto; vertical-align: baseline; width: auto; box-sizing: content-box; min-height: inherit; color: rgb(0, 51, 102) !important;">http://b674067f.m.daocloud.io"],"experimental":true,"exec-opts": ["native.cgroupdriver=systemd"]}

重启docker

systemctl restart docker

systemctl status docker

在各节点开机启动kubelet服务:

systemctl enable kubelet.service

kubernetes集群安装配置

以下集群配置工作需要在master节点进行:

1、准备镜像

kubernetes后期版本中,已经将集群中的控制平面组件全部docker化了,所以在kubeadm配置集群过程中以及kubelet启动pod过程中,需要用到以下镜像:

使用docker pull命令拉取以下对应的镜像:

mirrorgooglecontainers/kube-apiserver-amd64:v1.8.1

mirrorgooglecontainers/kube-controller-manager-amd64:v1.8.1

mirrorgooglecontainers/kube-proxy-amd64:v1.8.1

mirrorgooglecontainers/kube-scheduler-amd64:v1.8.1

mirrorgooglecontainers/k8s-dns-sidecar-amd64:1.14.5

mirrorgooglecontainers/k8s-dns-kube-dns-amd64:1.14.5

mirrorgooglecontainers/k8s-dns-dnsmasq-nanny-amd64:1.14.5

mirrorgooglecontainers/etcd-amd64:3.0.17

mirrorgooglecontainers/pause-amd64:3.0

例:

docker pull mirrorgooglecontainers/kube-apiserver-amd64:v1.8.1

kubeadm在init的时候,支持自定义镜像仓库的名字,但是kubelet运行pod的时候,默认会拉取取gcr.io/google_containers/pause-amd64:30这个

镜像,我们需要修改掉kubelet的配置,在加上ExecStart参数中加上

--pod-infra-container-image=mirrorgooglecontainers/pause-amd64:3.0

指定镜像为mirrorgooglecontainers/pause-amd64:3.0

注意,这一步需要在所有节点上操作!

vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf

[Service]

Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"

Environment="KUBELET_SYSTEM_PODS_ARGS=--pod-manifest-path=/etc/kubernetes/manifests --allow-privileged=true"

Environment="KUBELET_NETWORK_ARGS=--network-plugin=cni --cni-conf-dir=/etc/cni/net.d --cni-bin-dir=/opt/cni/bin"

Environment="KUBELET_DNS_ARGS=--cluster-dns=10.96.0.10 --cluster-domain=cluster.local"

Environment="KUBELET_AUTHZ_ARGS=--authorization-mode=Webhook --client-ca-file=/etc/kubernetes/pki/ca.crt"

Environment="KUBELET_CADVISOR_ARGS=--cadvisor-port=0"

Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=systemd"

Environment="KUBELET_CERTIFICATE_ARGS=--rotate-certificates=true --cert-dir=/var/lib/kubelet/pki"

ExecStart=

ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_SYSTEM_PODS_ARGS $KUBELET_NETWORK_ARGS $KUBELET_DNS_ARGS $KUBELET_AUTHZ_ARGS $KUBELET_CADVISOR_ARGS $KUBELET_CGROUP_ARGS $KUBELET_CERTIFICATE_ARGS $KUBELET_EXTRA_ARGS --pod-infra-container-image=mirrorgooglecontainers/pause-amd64:3.0

配置修改完毕后,需要reload一下服务

systemctl daemon-reload

2、使用kubeadm初始化集群

自定义配置文件,内容如下:

这里指定了

podSubnet: 10.244.0.0/16

表示使用flannel作为网络组件,指定了etcd的镜像。

etcd:

image: mirrorgooglecontainers/etcd-amd64:3.0.17

还有镜像仓库名字

imageRepository: mirrorgooglecontainers

vimaster.config

apiVersion: kubeadm.k8s.io/v1alpha1

kind: MasterConfiguration

networking:

podSubnet: 10.244.0.0/16

kubernetesVersion: v1.8.1

etcd:

image: mirrorgooglecontainers/etcd-amd64:3.0.17

imageRepository: mirrorgooglecontainers

在master节点上执行下面的命令,指定自定义的配置文件

kubeadm init --config=master.config

这里千万要记录下最后一行信息

这里包含了后面添加节点需要用到的token证书信息,并且无法再查询到该信息,一旦丢失将无法向集群添加节点了。

从安装过程中的提示我们可以看到,从1.8之后的版本开始,token默认有效期只有24小时了,所以24小时后我们再向集群添加节点时,会报token错误,这时候需要重新生成token

kubeadm token create

[kubeadm] WARNING: starting in 1.8, tokens expire after 24 hours by default (if you require a non-expiring token use --ttl 0)

24b5a5.c2cc1fd706296ab4

在 kubeadm join 命令中使用新生成的token就可以了。

集群初始化如果遇到问题,可以使用下面的命令进行清理:

kubeadm reset

默认装好的apiserver没有启用8080端口,需要修改一下配置:

vi /etc/kubernetes/manifests/kube-apiserver.yaml

将其中的insecure-port参数设置为8080

- --insecure-port=8080

修改完后需要重启下kubelet服务

systemctl restart kubelet

3、查看集群状态

确认个组件都处于healthy状态

kubectl get cs

NAME STATUS MESSAGE ERROR

controller-manager Healthy ok

scheduler Healthy ok

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

4、安装Pod Network

安装flannel network add-on:

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

kubectl apply -f kube-flannel.yml

clusterrole "flannel" created

clusterrolebinding "flannel" created

serviceaccount "flannel" created

configmap "kube-flannel-cfg" created

daemonset "kube-flannel-ds" created

使用kubectl get pod –all-namespaces -o wide确保所有的Pod都处于Running状态

kubectl get pod --all-namespaces -o wide

如果发现有的pod状态异常,可以使用kubectl describe pod podname命令查询错误信息

kubectl describe pod fabric8-docker-registry-6996457b46-p825w

注:在这一步过程中,kubelet可能会拉取不到quay.io/coreos/flannel:v0.9.0-amd64这个镜像,这时候需要手工docker pull quay.io/coreos/flannel:v0.9.0-amd64 一下。

5、向集群添加Node

在k8s-minor-1节点上执行之前初始化成功时保存的命令

kubeadm join --token 65c29e.b7aed84bc06c22ef 172.16.1.X:6443 --discovery-token-ca-cert-hash sha256:76982d08a08229208b0defdf1666212d16afebef10d1d1e9c020a72ce0039110

节点添加成功后,在master上查看集群的状态

kubectl get nodes

NAME STATUS ROLES AGE VERSION

k8s-minor-1 Ready <none> 1d v1.8.1

ubuntu-3 Ready master 4d v1.8.1

至此,k8s集群安装完毕,已经可以使用了。返回搜狐,查看更多

责任编辑:

声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
阅读 ()
投诉
免费获取
今日搜狐热点
今日推荐