Kubernetes是谷歌开源的用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制,本文主要讲解如何通过kubeadm部署k8s集群

文章概述简介

首先简单说一下本文需要做哪些内容,先准备2台服务器(这里选用centos7)作为2个节点node1(192.168.2.130)以及node2(192.168.2.131),然后选择node1作为k8s的master节点初始化k8s集群且不做pod负载、node2做pod的负载加入node1集群

一、系统配置

1.准备主机(192.168.2.130、192.168.2.131)

2.修改主机名使得2个节点执行命令:cat /etc/hosts后展示如下

192.168.2.130 node1
192.168.2.131 node2

3.开放端口(根据官方文档可以查看到需要开放的端口以及对应的作用,如果觉得麻烦也可以直接关闭两台服务器的防火墙)

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

net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1

5.执行命令使修改生效

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

二、kube-proxy开启ipvs的前置条件

概念简介:(ipvs&iptables)

ipvs (IP Virtual Server) 实现了传输层负载均衡,也就是我们常说的4层LAN交换,作为 Linux 内核的一部分。ipvs运行在主机上,在真实服务器集群前充当负载均衡器。ipvs可以将基于TCP和UDP的服务请求转发到真实服务器上,并使真实服务器的服务在单个 IP 地址上显示为虚拟服务。

ipvs vs. iptables

我们知道kube-proxy支持 iptables 和 ipvs 两种模式, 在kubernetes v1.8 中引入了 ipvs 模式,在 v1.9 中处于 beta 阶段,在 v1.11 中已经正式可用了。iptables 模式在 v1.1 中就添加支持了,从 v1.2 版本开始 iptables 就是 kube-proxy 默认的操作模式,ipvs 和 iptables 都是基于netfilter的,那么 ipvs 模式和 iptables 模式之间有哪些差异呢?

  • ipvs 为大型集群提供了更好的可扩展性和性能
  • ipvs 支持比 iptables 更复杂的复制均衡算法(最小负载、最少连接、加权等等)
  • ipvs 支持服务器健康检查和连接重试等功能

ipvs 依赖 iptables

ipvs 会使用 iptables 进行包过滤、SNAT、masquared(伪装)。具体来说,ipvs 将使用ipset来存储需要DROP或masquared的流量的源或目标地址,以确保 iptables 规则的数量是恒定的,这样我们就不需要关心我们有多少服务了

1.首先创建/etc/sysconfig/modules/ipvs.modules文件,保证在节点重启后能自动加载所需模块,文件内容如下

#!/bin/bash modprobe
— ip_vs modprobe
— ip_vs_rr modprobe
— ip_vs_wrr modprobe
— ip_vs_sh modprobe
— nf_conntrack_ipv4

2.修改文件权限并执行,以及使用lsmod | grep -e ip_vs -e nf_conntrack_ipv4命令查看是否已经正确加载所需的内核模块。

 chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

接下来还需要确保各个节点上已经安装了ipset软件包yum install ipset。 为了便于查看ipvs的代理规则,最好安装一下管理工具ipvsadm yum install ipvsadm。

如果以上前提条件如果不满足,则即使kube-proxy的配置开启了ipvs模式,也会退回到iptables模式

三、安装启动docker

1.安装docker yum源(分2步执行)

yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager \ –add-repo \ https://download.docker.com/linux/centos/docker-ce.repo

2.查看docker最新版本并安装启动

yum list docker-ce.x86_64 –showduplicates |sort -r
yum makecache fast
yum install -y –setopt=obsoletes=0 \ docker-ce-18.06.3.ce-3.el7
service docker start

3.执行:iptables -nvL 确认一下iptables filter表中FOWARD链的默认策略(pllicy)为ACCEPT

Docker从1.13版本开始调整了默认的防火墙规则,禁用了iptables filter表中FOWARD链,这样会引起Kubernetes集群中跨Node的Pod无法通信。但这里安装的docker 1806 默认策略调用链已改回ACCEPT

四、安装kubeadm和kubelet

这里需要说明一下,kubernetes是Google开源的应用,有部分资源的下载是需要科学上网才可获取,很麻烦,所以这里我们就通过切换阿里云镜像的方式来获取资源


1.在各个节点创建kubernetes.repo文件,使用阿里镜像且关闭check

vim /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
       http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg

2.安装并配置关闭Swap的限制

yum install -y kubelet kubeadm kubectl
vim /etc/sysconfig/kubelet
加入KUBELET_EXTRA_ARGS=–fail-swap-on=false配置

Kubernetes 1.8开始要求关闭系统的Swap,如果不关闭,默认配置下kubelet将无法启动。

五、kubeadm init初始化集群

1.在各节点开机启动kubelet服务

systemctl enable kubelet.service

2.如果已经科学上网了请忽略此步,此步是从docker.io下载k8s初始化集群需要的容器,然后修改tag

下载镜像:(需要下载的版本号,可以先首次执行一次初始化命令,查看error日志其下载失败的版本)
docker pull mirrorgooglecontainers/kube-apiserver-amd64:v1.13.0
docker pull mirrorgooglecontainers/kube-controller-manager-amd64:v1.13.0
docker pull mirrorgooglecontainers/kube-scheduler-amd64:v1.13.0
docker pull mirrorgooglecontainers/kube-proxy-amd64:v1.13.0
docker pull mirrorgooglecontainers/pause:3.1
docker pull mirrorgooglecontainers/etcd-amd64:3.2.24
docker pull coredns/coredns:1.2.6
修改tag:
docker tag docker.io/mirrorgooglecontainers/kube-apiserver-amd64:v1.13.0 k8s.gcr.io/kube-apiserver:v1.13.0
docker tag docker.io/mirrorgooglecontainers/kube-controller-manager-amd64:v1.13.0 k8s.gcr.io/kube-controller-manager:v1.13.0
docker tag docker.io/mirrorgooglecontainers/kube-scheduler-amd64:v1.13.0 k8s.gcr.io/kube-scheduler:v1.13.0
docker tag docker.io/mirrorgooglecontainers/kube-proxy-amd64:v1.13.0 k8s.gcr.io/kube-proxy:v1.13.0
docker tag docker.io/mirrorgooglecontainers/pause:3.1 k8s.gcr.io/pause:3.1
docker tag docker.io/mirrorgooglecontainers/etcd-amd64:3.2.24 k8s.gcr.io/etcd:3.2.24
docker tag docker.io/coredns/coredns:1.2.6 k8s.gcr.io/coredns:1.2.6

3.在node1执行以下命令初始化集群

kubeadm init \
–kubernetes-version=v1.13.0 \
–pod-network-cidr=10.244.0.0/16 \
–apiserver-advertise-address=192.168.2.130 \
–ignore-preflight-errors=Swap

配置用户如何使用kubelet访问集群 (node2如果需要使用kubectl也需要操作此步骤)
   mkdir -p $HOME/.kube 
   sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
查看集群状态:kubectl get cs,确认个组件都处于healthy状态。
补充:集群初始化如果遇到问题,可以使用下面的命令进行清理:

kubeadm reset
ifconfig cni0 down
ip link delete cni0
ifconfig flannel.1 down
ip link delete flannel.1
rm -rf /var/lib/cni/

六、安装pod network

1)mkdir -p ~/k8s/
2)cd ~/k8s
3)curl -O https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
4)kubectl apply -f  kube-flannel.yml
5)使用kubectl get pod –all-namespaces -o wide确保所有的Pod都处于Running状态

七、查看tonken和Kubernetes认证的SHA256加密字符串(token24小时过期需要重新create)

1)kubeadm token list
2)openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed ‘s/^.* //’

八、node加入集群

kubeadm join masterIp:6443 –token 查询到的token –discovery-token-ca-cert-hash sha256:查询到的SHA256加密字符串

小结

至此,k8s集群应该已经运行起来了,可以通过kubectl get nodes查看各个节点的状态,allReady is ok!

发表评论

电子邮件地址不会被公开。