kubernetes集群学习-01
Kubespray安装kubernetes(科学上网方式)
对于Kubernetes集群的部署,我只是一个入门者,涉及到了众多的运维知识,对于一个开发来说,确实挺难的。网上的教程大部分都是使用国外服务器,或者是手动下载相关依赖,或者修改Kubespray下载地址等,配置麻烦,所以我这边使用代理方式来部署,断断续续,花了近一个月的晚上,终于搭建好了。最后发现配置代理也不简单。所以相关的work节点也先放弃部署了。最后只部署2个master节点,一个工作节点。
kubespray 安装kubernetes 要求
复制kubespray 官方文档
- Kubernetes的最低要求版本为v1.16
- Ansible v2.9 +,Jinja 2.11+和python-netaddr安装在将运行Ansible命令的计算机上
- 目标服务器必须有权访问Internet才能提取Docker映像。否则,需要其他配置(请参见“ 脱机环境”)
- 目标服务器配置为允许IPv4转发。
- 您的ssh密钥必须复制到清单的所有服务器部分。
- 该防火墙没有管理,就需要实现自己的规则,你习惯的方式。为了避免在部署过程中出现任何问题,您应该禁用防火墙。
- 如果从非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)
- 更新yum源仓库
$ yum -y update
- 启用 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
- 查看可用的系统内核包
yum --disablerepo="*" --enablerepo=“elrepo-kernel” list available
4.安装最新版本内核
yum --enablerepo=elrepo-kernel install kernel-lt
安装完需要重启才生效
- 设置 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"
- 生成 grub 配置文件并重启
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot
7. 验证
$ uname -r
- 删除旧内核(可选)
查看系统中全部的内核:
$ 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