tmp
-
一、使用Kubespray部署Kubernetes生产集群
1. 服务器说明
1.1. 节点要求
节点数 >=3台
CPU >=2
Memory >=2G
安全组:关闭(允许节点之间任意端口访问,以及ipip隧道协议通讯)
计划使用阿里云的同学看过来:
1、多个节点同时购买,同一个账号,同一个地域,同一个可用区,保证内网ip可以联通!
2、购买阿里云服务器一定要用新用户,优惠力度非常大,尽量一次多买,后面再续费就贵了(我一般都是顶额购买,比如限制购买三台,那我就买三台,最多三年我就买三年,羊毛薅到了极致^_^)
3、新用户阿里云优惠购买通道(买完加v领现金: liuyi16wx):https://www.aliyun.com/daily-act/ecs/fy22-12-yure?userCode=92jeuqd91.2. 演示环境说明
我们这里使用的是三台centos 7.5的虚拟机,具体信息如下表:
系统类型 IP地址 节点角色 CPU Memory Hostname centos-7.5 10.155.19.223 master >=2 >=2G node-1 centos-7.5 10.155.19.64 master >=2 >=2G node-2 centos-7.5 10.155.19.147 worker >=2 >=2G node-3 2. 系统设置(所有节点)
注意:所有操作使用root用户执行
2.1 主机名
主机名必须合法,并且每个节点都不一样(建议命名规范:数字+字母+中划线组合,不要包含其他特殊字符)。
# 查看主机名 $ hostname # 修改主机名 $ hostnamectl set-hostname <your_hostname>2.2 关闭防火墙、selinux、swap,重置iptables
# 关闭selinux $ setenforce 0 $ sed -i '/SELINUX/s/enforcing/disabled/' /etc/selinux/config # 关闭防火墙 $ systemctl stop firewalld && systemctl disable firewalld # 设置iptables规则 $ iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT # 关闭swap $ swapoff -a && free –h # 关闭dnsmasq(否则可能导致容器无法解析域名) $ service dnsmasq stop && systemctl disable dnsmasq2.3 k8s参数设置
# 制作配置文件 $ cat > /etc/sysctl.d/kubernetes.conf <<EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 net.ipv4.ip_nonlocal_bind = 1 net.ipv4.ip_forward = 1 vm.swappiness = 0 vm.overcommit_memory = 1 EOF # 生效文件 $ sysctl -p /etc/sysctl.d/kubernetes.conf2.4 移除docker相关软件包(可选)
$ yum remove -y docker* $ rm -f /etc/docker/daemon.json3. 使用kubespray部署集群
这部分只需要在一个 操作 节点执行,可以是集群中的一个节点,也可以是集群之外的节点。甚至可以是你自己的笔记本电脑。我们这里使用更普遍的集群中的任意一个linux节点。
3.1 配置免密
使 操作 节点可以免密登录到所有节点
# 1. 生成keygen(执行ssh-keygen,一路回车下去) $ ssh-keygen # 2. 查看并复制生成的pubkey $ cat /root/.ssh/id_rsa.pub # 3. 分别登陆到每个节点上,将pubkey写入/root/.ssh/authorized_keys $ mkdir -p /root/.ssh $ echo "<上一步骤复制的pubkey>" >> /root/.ssh/authorized_keys3.2 依赖软件下载、安装
# 安装基础软件 $ yum install -y epel-release python36 python36-pip git # 下载kubespray源码 $ wget https://github.com/kubernetes-sigs/kubespray/archive/v2.15.0.tar.gz # 解压缩 $ tar -xvf v2.15.0.tar.gz && cd kubespray-2.15.0 # 安装requirements $ cat requirements.txt $ pip3.6 install -r requirements.txt ## 如果install遇到问题可以先尝试升级pip ## $ pip3.6 install --upgrade pip3.3 生成配置
项目中有一个目录是集群的基础配置,示例配置在目录inventory/sample中,我们复制一份出来作为自己集群的配置
# copy一份demo配置,准备自定义 $ cp -rpf inventory/sample inventory/mycluster由于kubespray给我们准备了py脚本,可以直接根据环境变量自动生成配置文件,所以我们现在只需要设定好环境变量就可以啦
# 使用真实的hostname(否则会自动把你的hostname改成node1/node2...这种哦) $ export USE_REAL_HOSTNAME=true # 指定配置文件位置 $ export CONFIG_FILE=inventory/mycluster/hosts.yaml # 定义ip列表(你的服务器内网ip地址列表,3台及以上,前两台默认为master节点) $ declare -a IPS=(10.155.19.223 10.155.19.64 10.155.19.147) # 生成配置文件 $ python3 contrib/inventory_builder/inventory.py ${IPS[@]}3.4 个性化配置
配置文件都生成好了,虽然可以直接用,但并不能完全满足大家的个性化需求,比如用docker还是containerd?docker的工作目录是否用默认的/var/lib/docker?等等。当然默认的情况kubespray还会到google的官方仓库下载镜像、二进制文件,这个就需要你的服务器可以上外面的网,想上外网也需要修改一些配置。
# 定制化配置文件 # 1. 节点组织配置(这里可以调整每个节点的角色) $ vi inventory/mycluster/hosts.yaml # 2. containerd配置(教程使用containerd作为容器引擎) $ vi inventory/mycluster/group_vars/all/containerd.yml # 3. 全局配置(可以在这配置http(s)代理实现外网访问) $ vi inventory/mycluster/group_vars/all/all.yml # 4. k8s集群配置(包括设置容器运行时、svc网段、pod网段等) $ vi inventory/mycluster/group_vars/k8s-cluster/k8s-cluster.yml # 5. 修改etcd部署类型为host(默认是docker) $ vi ./inventory/mycluster/group_vars/etcd.yml # 6. 附加组件(ingress、dashboard等) $ vi ./inventory/mycluster/group_vars/k8s-cluster/addons.yml3.5 一键部署
配置文件都调整好了后,就可以开始一键部署啦,不过部署过程不出意外会非常慢。
如果您使用的是教程同一个版本建议下使用网盘下载好二进制文件和镜像网盘下载二进制(可选)
链接: https://pan.baidu.com/s/11eDin8BDJVzGgXJW9e6cog 提取码: mrj9
下载好之后解压到每个节点的根目录即可,解压完成后的目录是/tmp/releases
一键部署
# -vvvv会打印最详细的日志信息,建议开启 $ ansible-playbook -i inventory/mycluster/hosts.yaml -b cluster.yml -vvvv经过漫长的等待后,如果没有问题,整个集群都部署起来啦
下载镜像(可选)
为了减少“一键部署”的等待时间,可以在部署的同时,预先下载一些镜像。
$ curl https://gitee.com/pa/pub-doc/raw/master/kubespray-v2.15.0-images.sh|bash -x重要:此操作需要确保上面的"一键部署"执行后,并成功安装了containerd后即可手动下载镜像)3.6 清理代理设置
清理代理设置(运行时不再需要代理,删掉代理配置即可)
删除docker的http代理(在每个节点执行)
$ rm -f /etc/systemd/system/containerd.service.d/http-proxy.conf $ systemctl daemon-reload $ systemctl restart containerd删除yum代理
# 把grep出来的代理配置手动删除即可 $ grep 8118 -r /etc/yum* -
2. Worker节点
增加worker节点
# 刷新缓存 $ ansible-playbook -i inventory/mycluster/hosts.yaml facts.yml -b -v # 修改配置hosts.yaml,增加节点 $ vi inventory/mycluster/hosts.yaml # 执行scale添加节点,--limit限制只在某个固定节点执行 $ ansible-playbook -i inventory/mycluster/hosts.yaml scale.yml --limit=NODE-NAME -b -v -
Unable to get valid context for root
Activate the web console with: systemctl enable --now cockpit.socket -
Failed to download packages: Cannot download Packages/libnetfilter_cthelper-1.0.0-15.el8.x86_64.rpm: All mirrors were tried
-
fatal: [node5]: FAILED! => {"attempts": 4, "changed": false, "msg": "Failed to download packages: Cannot download Packages/ipvsadm-1.31-1.el8.x86_64.rpm: All mirrors were tried", "results": []}
-
-
-
-
libnetfilter_queue-1.0.4-3.el8.x86_64.rpm
-
-
libnetfilter_cttimeout-1.0.0-11.el8.x86_64.rpm
-
-
socat-1.7.4.1-1.el8.x86_64.rpm
-
cd /etc/yum.repos.d/
创建新文件夹并将源文件备份为repo.bak
mkdir backup && mv repo backup/
下载国内yum源文件
curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-8.repo
更新下载yum源地址
sed -i -e"s|mirrors.cloud.aliyuncs.com|mirrors.aliyun.com|g " /etc/yum.repos.d/CentOS-
sed -i -e "s|releasever|releasever-stream|g" /etc/yum.repos.d/CentOS-*
生成缓存
yum clean all && yum makecache -
rrors during downloading metadata for repository 'appstream':
- Curl error (60): Peer certificate cannot be authenticated with given CA certificates for https://vault.centos.org/centos/8-stream/AppStream/x86_64/os/repodata/repomd.xml [SSL certificate problem: certificate has expired]
Error: Failed to download metadata for repo 'appstream': Cannot download repomd.xml: Cannot download repodata/repomd.xml: All mirrors were tried
- Curl error (60): Peer certificate cannot be authenticated with given CA certificates for https://vault.centos.org/centos/8-stream/AppStream/x86_64/os/repodata/repomd.xml [SSL certificate problem: certificate has expired]
-
name': 'containerd.io-1.3.9-3.1.el8', 'repo': 'docker-ce'}) => {"ansible_loop_var": "item", "attempts": 4, "changed": false, "item": {"name": "containerd.io-1.3.9-3.1.el8", "repo": "docker-ce"}, "msg": "Failed to download metadata for repo 'docker-ce': Cannot download repomd.xml: Cannot download repodata/repomd.xml: All mirrors were tried", "rc": 1, "results": []}
-
yum install -y docker-ce-19.03.15-3.el8
-
yum -y install docker-ce-19.03.6-3.el8 docker-ce-cli-19.03.6-3.el8 containerd.io
-
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install containerd.io-1.3.9-3.1.el8 docker-ce-cli-19.03.14-3.el8 docker-ce-19.03.14-3.el8
-
failed: [node5] (item={'name': 'containerd.io-1.3.9-3.1.el8', 'repo': 'docker-ce'}) => {"ansible_loop_var": "item", "attempts": 4, "changed": false, "item": {"name": "containerd.io-1.3.9-3.1.el8", "repo": "docker-ce"}, "msg": "Failed to download metadata for repo 'docker-ce': Cannot download repomd.xml: Cannot download repodata/repomd.xml: All mirrors were tried", "rc": 1, "results": []}