Ubuntu-16.04使用kubeadm安装kubernetes-1.18.3(阿里源快速安装与配置)

目录:

  • 官方文档和源码永远都是最好的学习资料,有什么问题大家可以讨论
    • docker官方文档
    • kubernetes官方文档
  • 一. 准备工作
    • 1.1 环境信息
    • 1.2 禁用SELINUX
    • 1.3 开启数据包转发
    • 1.4 禁用swap
    • 1.5 配置iptables参数,使得流经网桥的流量也经过iptables/netfilter防火墙
  • 二. 安装docker
    • 2.1 安装docker-18.03.1
    • 2.2 docker启动参数配置
    • 2.3 为docker设置http代理
  • 三. 安装kubeadm、kubelet、kubectl
    • 3.1 apt安装
  • 四. Kubernetes集群安装
    • 4.1 master节点部署
    • 4.2 网络部署
    • 4.3 slave节点部署

官方文档和源码永远都是最好的学习资料,有什么问题大家可以讨论

docker官方文档

kubernetes官方文档

一. 准备工作

1.1 环境信息

  • 操作系统:Ubuntu 16.04.1 LTS

关闭防火墙

  • 关闭ufw防火墙,Ubuntu默认未启用,无需设置。
$ sudo ufw disable  

备注:

  • ufw的底层是使用iptables进行数据过滤,建立在iptables之上,这可能会与 Docker 产生冲突。
  • 为避免不必要的麻烦,这里把firewalld关掉。

1.2 禁用SELINUX

  • ubuntu默认不安装selinux,假如安装了的话,按如下步骤禁用selinux

临时禁用(重启后失效)

$ sudo setenforce 0                 #0代表permissive 1代表enforcing

永久禁用

$ sudo vi /etc/selinux/config
SELINUX=permissive       

备注:

  • kubelet目前对selinux的支持还不好,需要禁用掉。
  • 不禁用selinux的话有时还会出现明明容器里是root身份运行,操作挂载进来的主机文件夹时没有权限的情况,这时候要么配置selinux的权限,要么就禁掉selinux
  • 另外,当docker的storage-driver使用overlay2的时候,低版本内核的selinux不支持overlay2文件驱动,docker启动时设置为–selinux-enabled会失败报错:“Error
    starting daemon: SELinux is not supported with the overlay2 graph
    driver on this kernel”,需设置–selinux-enabled=false

1.3 开启数据包转发

1.3.1 内核开启ipv4转发
1.修改/etc/sysctl.conf,开启ipv4转发:

$ sudo vim /etc/sysctl.conf
net.ipv4.ip_forward = 1             #开启ipv4转发,允许内置路由

2.写入后执行如下命令生效:

$ sudo sysctl -p

备注:

  • 什么是ipv4转发:出于安全考虑,Linux系统默认是禁止数据包转发的。转发即当主机拥有多于一块的网卡时,其中一块收到数据包,根据数据包的目的ip地址将数据包发往本机另一块网卡,该网卡根据路由表继续发送数据包。这通常是路由器所要实现的功能。
  • kube-proxy的ipvs模式和calico(都涉及路由转发)都需要主机开启ipv4转发。
  • 另外,不使用k8s,即使只使用docker的时候,以下两种情况也依赖ipv4转发:
    <1>当同一主机上的两个跨bridge(跨bridge相当于跨网段,跨网络需要路由)的容器互访 <2>从容器内访问外部

参考: https://docs.docker.com/v17.09/engine/userguide/networking/default_network/container-communication/#communicating-to-the-outside-world

1.3.2 防火墙修改FORWARD链默认策略

  • 数据包经过路由后,假如不是发往本机的流量,下一步会走iptables的FORWARD链,而docker从1.13版本开始,将FORWARD链的默认策略设置为DROP,会导致出现一些例如跨主机的两个pod使用podIP互访失败等问题。解决方案有2个:
  • 在所有节点上开机启动时执行iptables -P FORWARD ACCEPT
  • 让docker不操作iptables

方案一

临时生效:

$ sudo iptables -P FORWARD ACCEPT

iptables的配置重启后会丢失,可以将配置写进/etc/rc.local中,重启后自动执行:


/usr/sbin/iptables -P FORWARD ACCEPT

方案二

  • 设置docker启动参数添加–iptables=false选项,使docker不再操作iptables,比如1.10版以上可编辑docker
    daemon默认配置文件/etc/docker/daemon.json:
{
    "iptables": false
}

备注:

  • 建议方案二
  • kubernetes官网建议和k8s结合的时候docker的启动参数设置–iptables=false使得docker不再操作iptables,完全由kube-proxy来操作iptables。

1.4 禁用swap

1.禁掉所有的swap分区


$ sudo swapoff -a

2.同时还需要修改/etc/fstab文件,注释掉 SWAP 的自动挂载,防止机子重启后swap启用。

备注:

  • Kubernetes 1.8开始要求关闭系统的Swap,如果不关闭,默认配置下kubelet将无法启动,虽然可以通过kubelet的启动参数–fail-swap-on=false更改这个限制,但不建议,最好还是不要开启swap。

1.5 配置iptables参数,使得流经网桥的流量也经过iptables/netfilter防火墙

$ sudo tee /etc/sysctl.d/k8s.conf <<-'EOF'
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

$ sudo sysctl --system
  • 网络插件需要为kube-proxy提供一些特定的支持,比如kube-proxy的iptables模式基于iptables,网络插件就需要确保容器的流量可以流过iptables。比如一些网络插件会用到网桥,而网桥工作在数据链路层,iptables/netfilter防火墙工作在网络层,以上配置则可以使得通过网桥的流量也进入iptables/netfilter防火墙中,确保iptables模式的kube-proxy可以正常工作。
  • 默认没有指定kubelet网络插件的情况下,会使用noop插件,它也会设置net/bridge/bridge-nf-call-iptables=1来确保iptables模式的kube-proxy可以正常工作。

二. 安装docker

2.1 安装docker-18.03.1

1.卸载旧docker

$ sudo apt-get remove docker docker-engine docker.io         

2.安装依赖,使得apt可以使用https

sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

3.添加docker的GPG key:

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
  • 国内访问download.docker.com不稳定的话可以使用阿里云的
$ curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add -

4.设置docker镜像源

$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
  • 国内访问download.docker.com不稳定的话可以使用阿里云镜像源
$ sudo add-apt-repository \
   "deb [arch=amd64] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

5.安装指定版本docker-ce

  • 查看源中都有哪些版本:
$ apt-cache madison docker-ce
 docker-ce | 18.06.1~ce~3-0~ubuntu | https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 18.06.0~ce~3-0~ubuntu | https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages
 docker-ce | 18.03.1~ce~3-0~ubuntu | https://mirrors.aliyun.com/docker-ce/linux/ubuntu bionic/stable amd64 Packages

安装18.03.1版:

$ sudo apt-get install -y docker-ce=18.03.1~ce~3-0~ubuntu

6.启动并设置开机自启动docker

$ sudo systemctl enable docker && sudo systemctl start docker

7.将当前登录用户加入docker用户组中

$ sudo usermod -aG docker lk
  • 然后退出,重新登录,使用docker命令就不用加sudo了。

备注:

  • docker部署参考: https://docs.docker.com/install/linux/docker-ce/ubuntu.

2.2 docker启动参数配置

为docker做如下配置:

  • 设置阿里云镜像库加速dockerhub的镜像。国内访问dockerhub不稳定,将对dockerhub的镜像拉取代理到阿里云镜像库
  • 配上1.3.2的禁用iptables的设置
  • 如果想让podIP可路由的话,设置docker不再对podIP做MASQUERADE,否则docker会将podIP这个源地址SNAT成nodeIP
  • 设置docker存储驱动为overlay2(需要linux kernel版本在4.0以上,docker版本大于1.12)
  • 根据业务规划修改容器实例存储根路径(默认路径是/var/lib/docker)

最终配置如下:

$ sudo tee /etc/docker/daemon.json <<-'EOF'
{
 "registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"],
 "iptables": false,
 "ip-masq": false,
 "storage-driver": "overlay2",
 "graph": "/home/lk/docker"
}
EOF

$ sudo systemctl restart docker

可以在 /etc/docker/daemon.json 文件里加上:

{
 "registry-mirrors": [
 "https://kfwkfulq.mirror.aliyuncs.com",
 "https://2lqq34jg.mirror.aliyuncs.com",
 "https://pee6w651.mirror.aliyuncs.com",
 "https://registry.docker-cn.com",
 "http://hub-mirror.c.163.com"
]
}

这是阿里云的源

2.3 为docker设置http代理

  • 假如机器在内网环境无法直接访问外网的话,还需要为docker设置一个http_proxy。
$ sudo mkdir /etc/systemd/system/docker.service.d

$ sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf <<-'EOF'
[Service]
Environment="HTTP_PROXY=http://xxx.xxx.xxx.xxx:xxxx"
Environment="NO_PROXY=localhost,127.0.0.0/8"
EOF

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

三. 安装kubeadm、kubelet、kubectl

3.1 apt安装

3.1.1 创建kubernetes的repo
创建kubernetes的source文件:

  • google地址下载太慢,我们这里就使用阿里云或者中科大的镜像站:
sudo apt-get update && sudo apt-get install -y apt-transport-https curl

sudo curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -

sudo tee /etc/apt/sources.list.d/kubernetes.list <<-'EOF'
deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
EOF

sudo apt-get update

3.1.2 安装kubeadm、kubelet、kubectl
1.查看可用软件版本:

$ apt-cache madison kubeadm
   kubeadm |  1.12.1-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages
   kubeadm |  1.12.0-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages
   kubeadm |  1.11.3-00 | https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial/main amd64 Packages
   ......

2.安装指定版本:

sudo apt-get install -y kubelet=1.18.3-00 kubeadm=1.18.3-00 kubectl=1.18.3-00

sudo apt-mark hold kubelet=1.18.3-00 kubeadm=1.18.3-00 kubectl=1.18.3-00

3.设置开机自启动并运行kubelet:

sudo systemctl enable kubelet && sudo systemctl start kubelet

备注:

  • 此时kubelet的服务运行状态是异常的(因为缺少主配置文件kubelet.conf等,可以暂不处理,因为在完成Master节点的初始化后才会生成这个配置文件)

四. Kubernetes集群安装

4.1 master节点部署

4.1.1 提前下载所需镜像

看一下kubernetes v1.18.3需要哪些镜像:

$ kubeadm config images list --kubernetes-version=v1.18.3

然后执行这部直接把需要的镜像下载,然后 kubeadm init初始化集群 :

kubeadm init  --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.3   --pod-network-cidr=10.244.0.0/16

部署成功会输出如下内容:

Your Kubernetes master has initialized successfully!

To start using your cluster, you need to run the following as a regular user:

  mkdir -p $HOME/.kube
  sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
  sudo chown $(id -u):$(id -g) $HOME/.kube/config

You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
  https://kubernetes.io/docs/concepts/cluster-administration/addons/

You can now join any number of machines by running the following on each node
as root:

  kubeadm join 192.168.1.175:6443 --token v1nj22.l30dctzysf2jynly --discovery-token-ca-cert-hash sha256:0170607e7e069ffde2f2b6b440e7982f066887e59db49e9a62ac9518924af690

记下其中的token,加入node节点时会用到。

4.1.2 检查kubelet使用的cgroup driver

  • kubelet启动时指定的cgroup driver需要和docker所使用的保持一致。

1.查看 Docker 使用的 cgroup driver:

$ docker info | grep -i cgroup
-> Cgroup Driver: cgroupfs
  • 可以看出docker 17.03默认使用的Cgroup Driver为cgroupfs。

2.查看kubelet指定的cgroup driver

  • Kubernetes文档中kubelet的启动参数–cgroup-driver string Driver that the
    kubelet uses to manipulate cgroups on the host. Possible values:
    ‘cgroupfs’, ‘systemd’ (default
    “cgroupfs”)。默认值为cgroupfs。yum安装kubelet、kubeadm时生成10-kubeadm.conf文件中可能将这个参数值改成了systemd。

  • 查看kubelet的配置文件(1.12.0版本的封装在/var/lib/kubelet/kubeadm-flags.env文件中),如果是默认的cgroupfs,不需要修改。否则需要修改/etc/default/kubelet(或者/var/lib/kubelet/kubeadm-flags.env)

文件:

$ sudo vim /etc/default/kubelet
    KUBELET_KUBEADM_EXTRA_ARGS=--cgroup-driver=<value>    
$ sudo systemctl daemon-reload
$ sudo systemctl restart kubelet

4.1.3 创建kubectl使用的kubeconfig文件

$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
  • 创建完成即可使用kubectl操作集群。

4.1.4 设置master参与工作负载

  • 使用kubeadm初始化的集群,将master节点做了taint(污点),使得默认情况下(不设置容忍)Pod不会被调度到master上。这里搭建的是测试环境可以使用下面的命令去掉master的taint,使master参与工作负载:
$ kubectl taint nodes --all node-role.kubernetes.io/master-
 node/lk-thinkpad-t470 untainted

4.2 网络部署

  • 可以选择不同的网络插件,本文介绍calico。注意,同时只能使用一种网络插件。

## 4.2.1 calico部署

calico的数据存储可以有两种方式:

  • calico直接与etcd进行交互,使用etcd作为datastore的方式
  • calico和其他k8s组件一样通过kube-apiserver与etcd进行交互,将数据存储在etcd中(通过CRD实现)

1.到release页面获取安装包,这里用的是v3.8.7版本
这个下载特别慢,需要的可以给我留言,把压缩包发给你

wget https://github.com/projectcalico/calico/releases/download/v3.8.7/release-v3.8.7.tgz

2.解压后load release-v3.2.3/images下的镜像

calico-cni.tar
alico-kube-controllers.tar
calico-node.tar
calico-typha.tar

yaml中的配置需要修改下:

CALICO_IPV4POOL_CIDR 下面的ip修改为:10.244.0.0/16

3.创建rbac
先:

kubectl apply rbac/rbac-kdd-calico.yaml

然后再:

kubectl apply calico.yaml

执行上面两句时候记得注意目录

4. 为calico-node创建clusterrolebinding

kubectl create clusterrolebinding kube-system-default-role-binding --clusterrole=cluster-admin --serviceaccount=kube-system:calico-node

5.启动

kubectl apply -f release-v3.8.7/k8s-manifests/hosted/calico.yaml

启动了两类pod:

  • 名为calico-kube-controllers的Deployment
  • 名为calico-node的Daemonset

4.3 slave节点部署

  • 同样按照上述步骤安装好docker、kubelet,并将master节点上的/etc/kubernetes/pki/etcd拷贝到slave相同位置,用于calico-node连接etcd使用,然后在slave节点上执行以下命令即可加入集群:
kubeadm join 192.168.1.175:6443 --token w2ks3i.13l40j8ux38oz31r --discovery-token-ca-cert-hash sha256:387a9081b55dbed4263c22c9a8ffd5e7270c1bcdcca4299c2a69cba7d3df74e7

注意:默认token的有效期为24小时,当过期之后,该token就不可用了。此时可以重新生成token:

kubeadm token generate
kubeadm token create <generated-token> --print-join-command --ttl=0

设置–ttl=0代表永不过期

你可能感兴趣的:(kubernetes,kubernetes)