暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

k8s的简介以及搭建

王佐的运维笔记 2021-03-11
1146

由于公司要进行容器化,把在其中的一些心得分享给大家。


1.什么是k8s?

k8s是一个docker容器管理工具

它是一个全新的基于容器技术的分布式架构领先方案,是开源的容器集群管理系统。

在docker的基础上,为容器化的应用提供部署运行,资源调度,服务发现和动态伸缩等一系列完整功能


2.----k8s的优势:

    1.容器编排

    2.轻量级

    3.开源

    4.弹性伸缩

    5.负载均衡


二:k8s的核心功能


1.自愈: 重新启动失败的容器,在节点不可用时,替换和重新调度节点上的容器,对用户定义的健康检查不响应的容器会被中止,并且在容器准备好服务之前不会把其向客户端广播。

弹性伸缩: 通过监控容器的cpu的负载值,如果这个平均高于80%,增加容器的数量,如果这个平均低于10%,减少容器的数量

服务的自动发现和负载均衡: 不需要修改您的应用程序来使用不熟悉的服务发现机制,Kubernetes 为容器提供了自己的 IP 地址和一组容器的单个 DNS 名称,并可以在它们之间进行负载均衡。

滚动升级和一键回滚: Kubernetes 逐渐部署对应用程序或其配置的更改,同时监视应用程序运行状况,以确保它不会同时终止所有实例。如果出现问题,Kubernetes会为您恢复更改,利用日益增长的部署解决方案的生态系统。

2.核心概念

(1)masterk8s集群的管理节点,负责管理集群,提供集群的资源数据的访问入口

(2)Node node是k8s集群架构中运行pod的服务节点

(3)Pod 运行于Node节点上,若干相关容器的组合,pod内包含的容器运行在同一宿主机上,使用相同的网络命名空间,IP地址和端口,能够通过localhost进行通信


搭建:为了节省资源,本地搭建采用单master节点,两个node来进行部署

环境准备: 服务器配置至少:2核4G 的服务器

角色
主机名
ip
操作系统
配置
master
master192.168.0.10centos 7.8
2C 4G
node01
node1
192.168.0.11centos 7.82C 4G
node02node2192.168.0.12centos 7.82C 4G


更改hosts文件添加主机名与IP映射关系

命令:vim /etc/hosts

192.168.0.10     master
192.168.0.11 node1
192.168.0.12     node2
复制

关闭防火墙和selinux

systemctl stop firewalld              #临时关闭防火墙
setenforce 0 #关闭selinux,临时关闭
永久关闭:
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
复制




由于kubernetes最新升级到v20.1 并支持containerd, 也支持docker,但最终选择还是选择了kubernetes 1.19.5版本来进行安装


本文采用 kubernetes.io 官方推荐的 kubeadm 工具安装 kubernetes 集群。


首先:

检查 centos 的 hostname

# 在 master 节点和 worker 节点都要执行

# 不能使用 localhost 作为节点的名字

# 用 lscpu 命令,核对 CPU 信息

# Architecture: x86_64    目前暂时不支持arm架构

# CPU(s):       2         CPU 内核数量不能低于 2


操作系统最好使用centos 7.6 7.7 7.8

修改 hostname

# 修改 hostname

hostnamectl set-hostname 对应的主机名

hostnamectl set-hostname master
复制

# 查看修改结果

hostnamectl status
复制

# 设置 hostname 解析

echo "127.0.0.1   $(hostname)" >> /etc/hosts
复制

检查网络

在所有节点执行命令


ip route show
复制

所有节点上 Kubernetes 所使用的 IP 地址必须可以互通(无需 NAT 映射、无安全组或防火墙隔离)

master与node都要执行


使用阿里云 docker hub 镜像,脚本如下,另脚本放在百度云中:

链接: https://pan.baidu.com/s/1_Y_Vpas1syA8IvAjC0nHBA 提取码: dhpi 


export REGISTRY_MIRROR=https://registry.cn-hangzhou.aliyuncs.co
复制


#!/bin/bash


# 在 master 节点和 worker 节点都要执行


# 安装 docker
# 参考文档如下
# https://docs.docker.com/install/linux/docker-ce/centos/
# https://docs.docker.com/install/linux/linux-postinstall/


# 卸载旧版本
yum remove -y docker \
docker-client \
docker-client-latest \
docker-ce-cli \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine


# 设置 yum repository
yum install -y yum-utils \
device-mapper-persistent-data \
lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo


# 安装并启动 docker
yum install -y docker-ce-19.03.11 docker-ce-cli-19.03.11 containerd.io-1.2.13


mkdir /etc/docker || true


cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["${REGISTRY_MIRROR}"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2",
"storage-opts": [
"overlay2.override_kernel_check=true"
]
}
EOF


mkdir -p /etc/systemd/system/docker.service.d


# Restart Docker
systemctl daemon-reload
systemctl enable docker
systemctl restart docker


# 安装 nfs-utils
# 必须先安装 nfs-utils 才能挂载 nfs 网络存储
yum install -y nfs-utils
yum install -y wget


# 关闭 防火墙
systemctl stop firewalld
systemctl disable firewalld


# 关闭 SeLinux
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config


# 关闭 swap
swapoff -a
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak |grep -v swap > /etc/fstab


# 修改 /etc/sysctl.conf
# 如果有配置,则修改
sed -i "s#^net.ipv4.ip_forward.*#net.ipv4.ip_forward=1#g" /etc/sysctl.conf
sed -i "s#^net.bridge.bridge-nf-call-ip6tables.*#net.bridge.bridge-nf-call-ip6tables=1#g" /etc/sysctl.conf
sed -i "s#^net.bridge.bridge-nf-call-iptables.*#net.bridge.bridge-nf-call-iptables=1#g" /etc/sysctl.conf
sed -i "s#^net.ipv6.conf.all.disable_ipv6.*#net.ipv6.conf.all.disable_ipv6=1#g" /etc/sysctl.conf
sed -i "s#^net.ipv6.conf.default.disable_ipv6.*#net.ipv6.conf.default.disable_ipv6=1#g" /etc/sysctl.conf
sed -i "s#^net.ipv6.conf.lo.disable_ipv6.*#net.ipv6.conf.lo.disable_ipv6=1#g" /etc/sysctl.conf
sed -i "s#^net.ipv6.conf.all.forwarding.*#net.ipv6.conf.all.forwarding=1#g" /etc/sysctl.conf
# 可能没有,追加
echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.conf
echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.lo.disable_ipv6 = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.conf
# 执行命令以应用
sysctl -p


# 配置K8S的yum源
cat <<EOF > /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
EOF


# 卸载旧版本
yum remove -y kubelet kubeadm kubectl


# 安装kubelet、kubeadm、kubectl
yum install -y kubelet-1.19.5 kubeadm-1.19.5 kubectl-1.19.5


# 重启 docker,并启动 kubelet
systemctl daemon-reload
systemctl restart docker
systemctl enable kubelet && systemctl start kubelet


docker version
复制

 初始化 master 节点:

关于初始化时用到的环境变量

APISERVER_NAME 不能是 master 的 hostname

APISERVER_NAME 必须全为小写字母、数字、小数点,不能包含减号

POD_SUBNET 所使用的网段不能与 master节点/worker节点 所在的网段重叠

# 只在 master 节点执行
# 替换 x.x.x.x 为 master 节点的内网IP
# export 命令只在当前 shell 会话中有效,开启新的 shell 窗口后,如果要继续安装过程,请重新执行此处的 export 命令
export MASTER_IP=x.x.x.x
# 我这里192.168.0.10
# 替换 apiserver.test 为 您想要的 dnsName
export APISERVER_NAME=apiserver.test
# Kubernetes 容器组所在的网段,该网段安装完成后,由 kubernetes 创建,事先并不存在于您的物理网络中
export POD_SUBNET=10.100.0.1/16
echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hosts
复制

脚本如下:

百度网盘地址为:
链接: https://pan.baidu.com/s/1w6YSjbb2V8oL4Zi0LOK2iA 提取码: tb7m

#!/bin/bash


# 只在 master 节点执行


# 脚本出错时终止执行
set -e


if [ ${#POD_SUBNET} -eq 0 ] || [ ${#APISERVER_NAME} -eq 0 ]; then
echo -e "\033[31;1m请确保您已经设置了环境变量 POD_SUBNET 和 APISERVER_NAME \033[0m"
echo 当前POD_SUBNET=$POD_SUBNET
echo 当前APISERVER_NAME=$APISERVER_NAME
exit 1
fi




# 查看完整配置选项 https://godoc.org/k8s.io/kubernetes/cmd/kubeadm/app/apis/kubeadm/v1beta2
rm -f ./kubeadm-config.yaml
cat <<EOF > ./kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.19.5
imageRepository: registry.aliyuncs.com/k8sxio
controlPlaneEndpoint: "${APISERVER_NAME}:6443"
networking:
serviceSubnet: "10.96.0.0/16"
podSubnet: "${POD_SUBNET}"
dnsDomain: "cluster.local"
EOF


# kubeadm init
# 根据您服务器网速的情况,您需要等候 3 - 10 分钟
kubeadm config images pull --config=kubeadm-config.yaml
kubeadm init --config=kubeadm-config.yaml --upload-certs


# 配置 kubectl
rm -rf /root/.kube/
mkdir /root/.kube/
cp -i /etc/kubernetes/admin.conf /root/.kube/config


# 安装 calico 网络插件
# 参考文档 https://docs.projectcalico.org/v3.13/getting-started/kubernetes/self-managed-onprem/onpremises
echo "安装calico-3.13.1"
rm -f calico-3.13.1.yaml
wget https://kuboard.cn/install-script/calico/calico-3.13.1.yaml
kubectl apply -f calico-3.13.1.yaml
复制

检查 master 初始化结果

# 只在 master 节点执行


# 执行如下命令,等待 3-10 分钟,直到所有的容器组处于 Running 状态
watch kubectl get pod -n kube-system -o wide
# 查看 master 节点初始化结果
kubectl get nodes -o wide


复制

初始化 worker节点

#获得 join命令参数


在 master 节点上执行

# 只在 master 节点执行
kubeadm token create --print-join-command
复制
# 只在 worker 节点执行
# 替换 x.x.x.x 为 master 节点的内网 IP
export MASTER_IP=x.x.x.x
# 我这里的是export MASTER_IP=192.168.0.10
# 替换 apiserver.demo 为初始化 master 节点时所使用的 APISERVER_NAME
export APISERVER_NAME=apiserver.test
echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts


# 替换为 master 节点上 kubeadm token create 命令的输出
kubeadm join apiserver.test:6443 --token mpfjma.4vjjg8flqihor4vt --discovery-token-ca-cert-hash sha256:6f7a8e40a810323672de5eee6f4d19aa2dbdb38411845a1bf5dd63485c43d303

复制

有效时间

该 token 的有效时间为 2 个小时,2小时内,您可以使用此 token 初始化任意数量的 worker 节点

 

检查初始化结果

在 master 节点上执行

# 只在 master 节点执行
kubectl get nodes -o wide
# 持续观察
watch kubectl get nodes -o wide 
复制

输出的结果为:

[root@master~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
master  Ready    master   10m4s    v1.19.5
node1  Ready    <none>   5m27s   v1.19.5
node2   Ready   <none>   5m26s   v1.19.5
复制

至此 k8s单master集群,就搭建好了。

文章转载自王佐的运维笔记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论