Kubespray安装kubernetes

Kubespray安装kubernetes(科学上网方式)

对于Kubernetes集群的部署,我只是一个入门者,涉及到了众多的运维知识,对于一个开发来说,确实挺难的。网上的教程大部分都是使用国外服务器,或者是手动下载相关依赖,或者修改Kubespray下载地址等,配置麻烦,所以我这边使用代理方式来部署,断断续续,花了近一个月的晚上,终于搭建好了。最后发现配置代理也不简单。所以相关的work节点也先放弃部署了。最后只部署2个master节点,一个工作节点。

kubespray 安装kubernetes 要求

复制kubespray 官方文档

  1. Kubernetes的最低要求版本为v1.16
  2. Ansible v2.9 +,Jinja 2.11+和python-netaddr安装在将运行Ansible命令的计算机上
  3. 目标服务器必须有权访问Internet才能提取Docker映像。否则,需要其他配置(请参见“ 脱机环境”)
  4. 目标服务器配置为允许IPv4转发。
  5. 您的ssh密钥必须复制到清单的所有服务器部分。
  6. 该防火墙没有管理,就需要实现自己的规则,你习惯的方式。为了避免在部署过程中出现任何问题,您应该禁用防火墙。
  7. 如果从非root用户帐户运行kubespray,则应在目标服务器中配置正确的特权升级方法。然后,应指定ansible_become标志或命令参数–become or -b。

kubernetes 节点规划

192.168.10.51 master01 +Ansible 管理节点
192.168.10.52 master02
192.168.10.53 master03
192.168.10.161 work01
192.168.10.162 work02
192.168.10.163 work03

配置代理服务(非必需,但是得解决docker 镜像依赖问题)

1、 centos服务器 配置代理并跳过本地IP段

vi /etc/profile

no_proxy_192=$(echo 192.168.1.{1..255}|sed 's/ /,/g')
no_proxy_10=$(echo 10.2.7.{1..255}|sed 's/ /,/g')
export no_proxy="127.0.0.1,localhost,.domain.com,${no_proxy_192},${no_proxy_10}"
export http_proxy=http://192.168.10.153:7890/
export https_proxy=http://192.168.10.153:7890/
export ftp_proxy=http://192.168.10.153:7890/

#生效配置
source /etc/profile

#查看代理配置
env | grep -i proxy

临时删除代理
unset http_proxy
unset https_proxy
unset ftp_proxy

2、yum代理设置

#打开yum.conf文件
vim /etc/yum.conf

#添加Proxy代理信息
proxy = http://192.168.10.153:7890/

如果只是暂时使用代理,在命令行输入下面一条命令:
export http_proxy=“http://192.168.10.153:7890/”

3、docker 配置代理 并跳过本地IP段192.168.0.0/24(docker安装后配置)

vi /etc/systemd/system/docker.service.d/https-proxy.conf

[Service]
Environment="HTTP_PROXY=http://192.168.10.153:7890/" "HTTPS_PROXY=http://192.168.10.153:7890/"  "NO_PROXY=localhost,127.0.0.1,qc20rc43.mirror.aliyuncs.com,192.168.0.0/24,"

systemctl daemon-reload
systemctl restart docker
systemctl show --property=Environment docker

4、kubespray 设置全局代理**本步骤应该在kubespray 安装后配置

vi /opt/kubespray/inventory/mycluster/group_vars/all/all.yml
2 bootstrap_os: centos
95 http_proxy: “http://192.168.10.153:7890/”

主机基本配置

1. 配置主机名

1.1 修改主机名(其他服务器也完成类似修改)

[root@centos7 ~]# hostnamectl set-hostname master01
[root@centos7 ~]# more /etc/hostname             
master01

1.2 修改hosts文件

[root@master01 ~]# 
cat >> /etc/hosts << EOF
192.168.10.51    master01
192.168.10.52    master02
192.168.10.53    master03
192.168.10.161   work01 
192.168.10.162   work02
192.168.10.163   work03
EOF

查看验证
more /etc/hosts

2. 验证mac地址uuid(虚拟机搭建)

[root@master01 ~]# cat /sys/class/net/eth0/address
[root@master01 ~]# cat /sys/class/dmi/id/product_uuid   或者:dmidecode -s system-uuid

保证各节点mac和uuid唯一
vi /etc/sysconfig/network-scripts/ifcfg-eth0
1、修改UUID
2、修改IPADDR地址
3、重启网卡
#service network restart

重新生成product_uuid方法,修改虚拟机创建方法:

1.关闭要克隆的计算机。
2.制作所需数量的VHD副本。
3.使用“新建虚拟机”向导,并使用复制的VHD制作新计算机。
4.打开并检查新的UUID。这不一样。

3. 禁用swap

3.1 临时禁用
[root@master01 ~]# swapoff -a
3.2 永久禁用
若需要重启后也生效,在禁用swap后还需修改配置文件/etc/fstab,注释swap

[root@master01 ~]# sed -i.bak '/swap/s/^/#/' /etc/fstab

4. 内核参数修改(非必选)

4.1 br_netfilter模块加载
4.2 内核参数临时修改

[root@master01 ~]# sysctl net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-iptables = 1
[root@master01 ~]# sysctl net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-ip6tables = 1

4.3 内核参数永久修改

[root@master01 ~]# cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1 
net.ipv4.tcp_tw_recycle=0 
vm.swappiness=0 # 禁止使用 swap 空间,只有当系统 OOM 时才允许使用它 
vm.overcommit_memory=1 # 不检查物理内存是否够用 
vm.panic_on_oom=0 # 开启 OOM 
fs.inotify.max_user_instances=8192 
fs.inotify.max_user_watches=1048576 
fs.file-max=52706963 
fs.nr_open=52706963 
net.ipv6.conf.all.disable_ipv6=1 
net.netfilter.nf_conntrack_max=2310720 
EOF
[root@master01 ~]# sysctl -p /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1

5. 设置kubernetes源

5.1 新增kubernetes源(阿里云)

[root@master01 ~]# cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

5.2 更新缓存

[root@master01 ~]# yum clean all
[root@master01 ~]# yum -y makecache

6. 免密登录

配置master01到master02、master03免密登录,本步骤只在master01上执行。

6.1 创建秘钥
[root@master01 ~]# ssh-keygen -t rsa

6.2 将秘钥同步至master02/master03
[root@master01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.10.52
[root@master01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.10.53
** 如果主机也需要部署k8s,那也需要同步密钥。**
[root@master01 ~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.10.51

6.3 免密登陆测试
[root@master01 ~]# ssh 192.168.10.52
[root@master01 ~]# ssh master03

master01可以直接登录master02和master03,不需要输入密码。

6.4 将hosts文件至master02/master03(这时同步无需输入密码)
[root@localhost ~]# scp /etc/hosts master02:/etc/hosts
[root@localhost ~]# scp /etc/hosts master03:/etc/hosts

7.关闭防火墙:

systemctl disable firewalld
systemctl stop firewalld

8. 因为本次使用KubeSpray操作部署,所以所有的主机都需要关闭防火墙等相关的操作。

所以的主机都需要关闭selinux,执行的命令如下:

setenforce 0
sed -i --follow-symlinks 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

升级centos内核(centos7)

  1. 更新yum源仓库

$ yum -y update

  1. 启用 ELRepo 仓库

#导入ELRepo仓库的公共密钥

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

#安装ELRepo仓库的yum源

rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

  1. 查看可用的系统内核包

yum --disablerepo="*" --enablerepo=“elrepo-kernel” list available

4.安装最新版本内核

yum --enablerepo=elrepo-kernel install kernel-lt

安装完需要重启才生效

  1. 设置 grub2

sudo awk -F’ ‘$1=="menuentry " {print i++ " : " $2}’ /etc/grub2.cfg

如果查询不到grub2.cfg文件,则生成该文件
grub2-mkconfig -o /boot/grub2/grub.cfg

设置新的内核为grub2的默认版本
服务器上存在4 个内核,我们要使用 4.18 这个版本,可以通过 grub2-set-default 0 命令或编辑 /etc/default/grub 文件来设置

方法1、通过 grub2-set-default 0 命令设置
其中 0 是上面查询出来的可用内核

grub2-set-default 0

方法2、编辑 /etc/default/grub 文件
设置 GRUB_DEFAULT=0,通过上面查询显示的编号为 0 的内核作为默认内核:

vim /etc/default/grub

$ vim /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=0
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=cl/root rhgb quiet"
GRUB_DISABLE_RECOVERY="true"
  1. 生成 grub 配置文件并重启

grub2-mkconfig -o /boot/grub2/grub.cfg

reboot
7. 验证
$ uname -r

  1. 删除旧内核(可选)

查看系统中全部的内核:
$ rpm -qa | grep kernel

方法1、yum remove 删除旧内核的 RPM 包
$ yum remove kernel-3.10.0-514.el7.x86_64 \

方法2、yum-utils 工具
如果安装的内核不多于 3 个,yum-utils 工具不会删除任何一个。只有在安装的内核大于 3 个时,才会自动删除旧内核。

安装yum-utils
$ yum install yum-utils

删除旧版本
package-cleanup --oldkernels

Docker安装

control plane和work节点都执行本部分操作。

1. 安装依赖包

[root@master01 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2

2. 设置Docker源

yum-config-manager
–add-repo
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3. 安装Docker CE

3.1 docker安装版本查看
[root@master01 ~]# yum list docker-ce --showduplicates | sort -r

3.2 安装docker指定版本
[root@master01 ~]# yum install docker-ce-18.09.9 docker-ce-cli-18.09.9 containerd.io -y

4. 启动Docker

[root@master01 ~]# systemctl start docker
[root@master01 ~]# systemctl enable docker

5. 命令补全

5.1 安装bash-completion
[root@master01 ~]# yum -y install bash-completion
5.2 加载bash-completion
[root@master01 ~]# source /etc/profile.d/bash_completion.sh

6. 镜像加速

由于Docker Hub的服务器在国外,下载镜像会比较慢,可以配置镜像加速器。主要的加速器有:Docker官方提供的中国registry mirror、阿里云加速器、DaoCloud 加速器,本文以阿里加速器配置为例。
6.1 登陆阿里云容器模块获取镜像加速地址
登陆地址为:https://cr.console.aliyun.com ,未注册的可以先注册阿里云账户

6.2 配置镜像加速器
配置daemon.json文件

[root@master01 ~]# mkdir -p /etc/docker
[root@master01 ~]# tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://v16stybc.mirror.aliyuncs.com"]
}
EOF

重启服务
[root@master01 ~]# systemctl daemon-reload
[root@master01 ~]# systemctl restart docker
加速器配置完成

7. 验证

[root@master01 ~]# docker --version
[root@master01 ~]# docker run hello-world

8. 修改Cgroup Driver

8.1 修改daemon.json
修改daemon.json,新增‘”exec-opts”: [“native.cgroupdriver=systemd”’

[root@master01 ~]# more /etc/docker/daemon.json
{
“registry-mirrors”: [“https://v16stybc.mirror.aliyuncs.com”],
“exec-opts”: [“native.cgroupdriver=systemd”]
}

8.2 重新加载docker
[root@master01 ~]# systemctl daemon-reload
[root@master01 ~]# systemctl restart docker

修改cgroupdriver是为了消除告警:
[WARNING IsDockerSystemdCheck]: detected “cgroupfs” as the Docker cgroup driver. The recommended driver is “systemd”. Please follow the guide at https://kubernetes.io/docs/setup/cri/

9 docker 配置代理

vi /etc/systemd/system/docker.service.d/http-proxy.conf

[Service]
Environment=“HTTP_PROXY=http://192.168.10.153:7890/” “HTTPS_PROXY=http://192.168.10.153:7890/” “NO_PROXY=localhost,127.0.0.1,qc20rc43.mirror.aliyuncs.com,192.168.0.0/24,”

vi /etc/systemd/system/docker.service.d/https-proxy.conf

[Service]
Environment=“HTTPS_PROXY=http://192.168.10.153:7890/”

systemctl daemon-reload
systemctl restart docker
systemctl show --property=Environment docker

Kubespray部署K8S

1. 安装 python 及 epel (在Ansible主机上安装并配置好与各node的免秘钥登录)

yum install -y epel-release python36 python36-pip git

2. 克隆项目

wget https://github.com/kubernetes-sigs/kubespray/archive/kubespray-2.13.3.tar.gz

tar -zxvf kubespray-2.13.3.tar.gz

mv kubespray-2.3.0/ kubespray/

3. 配置python国内源,修改 ~/.pip/pip.conf

mkdir ~/.pip
cat >> ~/.pip/pip.conf <<-'EOF'
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
EOF

4. 进入 项目 安装项目依赖

cd  /opt/kubespray/
pip3 install -r requirements.txt

/usr/bin/pip3.6 install -r   /opt/kubespray/requirements.txt

5. 复制配置文档

cp -rfp inventory/sample inventory/mycluster

6. 利用kubespray自带的python脚本生成配置

declare -a IPS=(192.168.10.51 192.168.10.52 192.168.10.53)

CONFIG_FILE=inventory/mycluster/hosts.yaml /usr/bin/python3.6 contrib/inventory_builder/inventory.py ${IPS[@]}

生成 hosts.yaml示例:

all:
  hosts:
    node1:
      ansible_host: 192.168.10.51
      ip: 192.168.10.51
      access_ip: 192.168.10.51
    node2:
      ansible_host: 192.168.10.52
      ip: 192.168.10.52
      access_ip: 192.168.10.52
    node3:
      ansible_host: 192.168.10.53
      ip: 192.168.10.53
      access_ip: 192.168.10.53
  children:
    kube-master:
      hosts:
        node1:
        node2:
    kube-node:
      hosts:
        node1:
        node2:
        node3:
    etcd:
      hosts:
        node1:
        node2:
        node3:
    k8s-cluster:
      children:
        kube-master:
        kube-node:
    calico-rr:
      hosts: {}

6.1 修改配置文档
默认安装版本较低,指定kubernetes版本
vi inventory/mycluster/group_vars/k8s-cluster/k8s-cluster.yml
kube_version: v1.18.8

** 设置 kubespray代理**

vi /opt/kubespray/inventory/mycluster/group_vars/all
2 bootstrap_os: centos
95 http_proxy: “http://192.168.10.153:7890/”

7. 安装启动集群(服务器免秘钥登录必须)

ansible-playbook -i inventory/mycluster/hosts.yaml cluster.yml -b -v --private-key=~/.ssh/id_rsa

验证集群启动

kubectl get no 或者:kubectl get nodes

8. 新增集群子节点

修改 hosts.yaml增加节点配置
执行命令:

ansible-playbook -i inventory/mycluster/hosts.yaml scale.yml -b -v

ansible-playbook -i inventory/mycluster/hosts.yml scale.yml -b -v \
  --private-key=~/.ssh/private_key

或者重新运行集群命令,注意增加 --limit 参数

ansible-playbook -i inventory/hosts.yml cluster.yml -b -v --private-key=~/.ssh/id_rsa --limit node6
稍等片刻 node6 节点便加入现有集群,如果有多个节点加入,只需要以逗号分隔即可,如 --limit node5,node6;在此过程中只会操作新增的 node 节点,不会影响现有集群,可以实现动态集群扩容(master 也可以扩展)

9. 删除集群节点

1、hosts.yaml无需修改,运行命令–extra-vars指定node。

ansible-playbook -i inventory/mycluster/hosts.yml remove-node.yml -b -v \
--private-key=~/.ssh/private_key \
--extra-vars "node=nodename,nodename2"

官方文档地址

10. 升级组件

ansible-playbook upgrade-cluster.yml -b -i inventory/sample/hosts.ini -e kube_version=v1.15.0

官方文档地址

11. 卸载

ansible-playbook -i inventory/mycluster/hosts.ini reset.yml

#每台node都要执行
rm -rf /etc/kubernetes/
rm -rf /var/lib/kubelet
rm -rf /var/lib/etcd
rm -rf /usr/local/bin/kubectl
rm -rf /etc/systemd/system/calico-node.service
rm -rf /etc/systemd/system/kubelet.service
 
reboot

安裝 Helm

调整 inventory/{name}/group_vars/k8s-cluster/addons.yml

使用 inventory/k8s/group_vars/k8s-cluster/addons.yml 为例

helm_enabled: true

执行部署
ansible-playbook -i inventory/mycluster/hosts.yaml cluster.yml -b -vvv --private-key=~/.ssh/id_rsa

总结

k8s用起来不简单,搭建维护也不简单。新手入门,记录了操作部署步骤,希望对大家有一定的帮助。能与更多人一起研究学习。

后续我这边会继续学习整理kubernetes相关组件等包括 。
1、安装 Harbor 安全地管理映像
2、安装 Docker Registry
3、私有docker镜像仓库的registry实现https方案。
4、Kubernetes HA Master集群
5、K8S集群增加Dashboard子系统实现容器编排与调度工作的可视化

参考资料

参考的文章:
https://blog.csdn.net/forezp/article/details/82730382


版权声明:本文为u011685400原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。