1.概念简介
Kubernetes 是一个可移植、可扩展的开源平台,用于管理容器化的工作负载和服务,方便进行声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态系统,其服务、支持和工具的使用范围广泛。
为什么需要 Kubernetes,它能做什么?
容器是打包和运行应用程序的好方式。在生产环境中, 你需要管理运行着应用程序的容器,并确保服务不会下线。 例如,如果一个容器发生故障,则你需要启动另一个容器。 如果此行为交由给系统处理,是不是会更容易一些?
这就是 Kubernetes 要来做的事情! Kubernetes 为你提供了一个可弹性运行分布式系统的框架。 Kubernetes 会满足你的扩展要求、故障转移你的应用、提供部署模式等。 例如,Kubernetes 可以轻松管理系统的 Canary (金丝雀) 部署。
Kubernetes 为你提供:
-
服务发现和负载均衡
Kubernetes 可以使用 DNS 名称或自己的 IP 地址来暴露容器。 如果进入容器的流量很大, Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。
-
存储编排
Kubernetes 允许你自动挂载你选择的存储系统,例如本地存储、公共云提供商等。
-
自动部署和回滚
你可以使用 Kubernetes 描述已部署容器的所需状态, 它可以以受控的速率将实际状态更改为期望状态。 例如,你可以自动化 Kubernetes 来为你的部署创建新容器, 删除现有容器并将它们的所有资源用于新容器。
-
自动完成装箱计算
你为 Kubernetes 提供许多节点组成的集群,在这个集群上运行容器化的任务。 你告诉 Kubernetes 每个容器需要多少 CPU 和内存 (RAM)。 Kubernetes 可以将这些容器按实际情况调度到你的节点上,以最佳方式利用你的资源。
-
自我修复
Kubernetes 将重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器, 并且在准备好服务之前不将其通告给客户端。
-
密钥与配置管理
Kubernetes 允许你存储和管理敏感信息,例如密码、OAuth 令牌和 SSH 密钥。 你可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。
- 批处理执行 除了服务外,Kubernetes 还可以管理你的批处理和 CI(持续集成)工作负载,如有需要,可以替换失败的容器。
- 水平扩缩 使用简单的命令、用户界面或根据 CPU 使用率自动对你的应用进行扩缩。
- IPv4/IPv6 双栈 为 Pod(容器组)和 Service(服务)分配 IPv4 和 IPv6 地址。
- 为可扩展性设计 在不改变上游源代码的情况下为你的 Kubernetes 集群添加功能。
Kubernetes 文档https://kubernetes.io/zh-cn/docs/concepts/
2.环境准备
使用CentOS 7,镜像CentOS-7-x86_64-DVD-2009.isoCentOS-7-x86_64-DVD-2009.iso镜像下载地址https://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-2009.iso?spm=a2c6h.25603864.0.0.4a872d1cS4z0M6通过百度网盘分享的文件:资源包-k8s安装
链接:https://pan.baidu.com/s/1gbF_bWqHfoabpXPK93JZ_w?pwd=bona
提取码:bona
需要部署1个master节点和4个node节点,总共5台虚拟机;网络自行选择桥接或NAT模式,能ping通百度就行;修改好主机名
主机名/hostname | ip地址/IPADDR | 网关/GATEWAY |
k8smaster | 192.168.10.10 | 192.168.10.2 |
k8snode1 | 192.168.10.11 | 192.168.10.2 |
k8snode2 | 192.168.10.12 | 192.168.10.2 |
k8snode3 | 192.168.10.13 | 192.168.10.2 |
k8snode4 | 192.168.10.14 | 192.168.10.2 |
3.操作过程
3.1.K8S安装前准备工作
3.1.1.所有节点关闭防火墙firewalld和selinux,并清除iptables规则
# 关闭防火墙并且设置开机不自启
systemctl stop firewalld
systemctl disable firewalld
# 关闭selinux并且设置开机不自启
setenforce 0
vi /etc/selinux/config
enforcing 改成 disabled
# 清除iptables规则
iptables -F
3.1.2.所有节点关闭交换分区,以提升性能(k8s1.8版本以上要求必须关闭)
# 临时关闭交换分区
swapoff -a
# 修改/etc/fstab,将文件中/dev/mapper/centos-swap swap行注释掉,即可文件永久关闭交换分区
# 或者也可以直接运行下面这条命令永久关闭交换分区
sed -i '/swap/ s/^\(.*\)$/#\1/g' /etc/fstab
3.1.3.所有节点修改/etc/hosts文件,配置了IP地址和主机名的映射关系
# 添加如下内容,保存退出
192.168.10.10 k8smaster
192.168.10.11 k8snode1
192.168.10.12 k8snode2
192.168.10.13 k8snode3
192.168.10.14 k8snode4
# 修改好之后,各节点互ping对应节点的hostname测试一下,能ping通就没问题
[root@k8smaster ~]# ping k8snode1 -c2
PING k8snode1 (192.168.10.11) 56(84) bytes of data.
64 bytes from k8snode1 (192.168.10.11): icmp_seq=1 ttl=64 time=0.744 ms
64 bytes from k8snode1 (192.168.10.11): icmp_seq=2 ttl=64 time=0.485 ms
--- k8snode1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.485/0.614/0.744/0.131 ms
3.1.4.所有节点加载模块br_netfilter
br_netfilter模块可以使iptables规则可以在Linux Bridges上面工作,用于将桥接的流量转发至iptables链;如果没有加载br_netfilter模块,那么并不会影响不同node上的pod之间的通信,但是会影响同node内的pod之间通过service来通信
# 临时加载模块br_netfilter
modprobe br_netfilter
# 永久加载模块br_netfilter,在/etc/modules-load.d/k8s.conf文件中写入模块名字br_netfilter
cat >> /etc/hosts << EOF
> br_netfilter
> EOF
# 重启systemd-modules-load.service服务
# systemd-modules-load.service是systemd提供的一个开机自启动服务,用于在系统启动时根据静态的配置文件或者内核启动参数加载内核模块
systemctl restart systemd-modules-load.service
3.1.5.所有节点修改内核参数以满足k8s的运行需求
cat >> /etc/sysctl.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
> EOF
# 重新加载系统参数配置,使配置生效
sysctl -p
3.1.6.所有节点配置时间同步服务
# 修改/etc/chrony.conf配置文件,如下图
# 这一步使设置时基服务器同步的远端授时中心。这里我们使用ntp.aliyun.com作为远端授时中心
vim /etc/chrony.conf
# 重启时间同步服务并且设置开机自启
systemctl start chronyd
systemctl enable chronyd
# 查看时间
date
3.1.7.所有节点安装docker,步骤参考阿里云镜像站教程
# Step 1: 安装必要的一些系统工具
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# Step 2: 添加软件源信息
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# Step 3
sudo sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
# Step 4: 更新并安装Docker-CE
sudo yum makecache fast
sudo yum -y install docker-ce
# Step 4: 开启Docker服务
sudo service docker start
3.2.K8S安装
3.2.1.所有节点安装k8s,步骤参考阿里云镜像站教程
Kubernetes配置方法https://developer.aliyun.com/mirror/kubernetes?spm=a2c6h.13651102.0.0.44ac1b11L6abXg
# 配置k8s的yum源
cat <<EOF | tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes-new/core/stable/v1.28/rpm/repodata/repomd.xml.key
EOF
# 安装kubelet、kubeadm、kubectl
yum install -y kubelet kubeadm kubectl
# 启动kubelet并且设置开机自启
systemctl enable kubelet && systemctl start kubelet
3.2.2.所有节点配置docker镜像加速器,华为云有教程
华为云官网https://www.huaweicloud.com/
3.2.3.所有节点安装CoreDNS容器,CoreDNS是Kubernetes 集群中的默认 DNS 服务,用于解析 Pod 的 DNS 记录
# 拉取镜像
docker pull coredns/coredns:1.8.4
# 给镜像打tag
docker tag coredns/coredns:1.8.4 registry.aliyuncs.com/google_containers/coredns:v1.8.4
我们上一步配置了华为云的镜像加速器,所以这步正常来说应该是能正常拉取镜像的,如果拉取失败,就换阿里云的镜像加速器,步骤差不多
如果还是拉取失败,就喝杯茶休息一下吧...过一会儿再试试,说不定就行了...
3.2.4.master节点初始化
kubeadm init \
--apiserver-advertise-address=192.168.10.10 \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16
# –apiserver-advertise-address # 集群通告地址,填写master节点ip
# –image-repository # 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
# –kubernetes-version #K8s版本,与上面安装的一致
# –service-cidr #集群内部虚拟网络,Pod统一访问入口,可以不用更改,直接用上面的参数
# –pod-network-cidr #Pod网络,与下面部署的CNI网络组件yaml中保持一致,可以不用更改,直接用上面的参数
输出内容建议保存,红框出来的是之后node节点加入集群的命令
kubeadm join 192.168.10.10:6443 --token 91rgh7.fao3v8j30tbcr1el \
--discovery-token-ca-cert-hash sha256:35e9d72195a98a51571fe313aedd865b735f39fd3a4276d89faae0bf4c8aac89
3.2.5.master节点配置相应参数
# 创建$HOME/.kube目录,-p是递归创建目录
mkdir -p $HOME/.kube
# 将 Kubernetes 集群的管理员配置文件复制到 $HOME/.kube/config,以便 kubectl 命令可以使用它来连接到集群
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
# 将 $HOME/.kube/config 文件的所有者和所属组修改为当前用户和当前用户的主要组,这样当前用户就有权限读取和修改这个配置文件了
chown $(id -u):$(id -g) $HOME/.kube/config
3.2.6.master节点k8s配置安装flannel网络
# 下载kube-flannel.yml,下不了的我上面的链接里有
wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
# 修改kube-flannel.yml文件内容,找到如下位置
# 修改Network这行的内容,要与执行kubeadm init(master节点初始化)输入的网段一致
net-conf.json: |
{
"Network": "10.244.0.0/16",
"Backend"": {
"Type": "vxlan"
}
}
vi/vim快速查找方法如下,红框框起来了
# k8s安装flannel网络
kubectl apply -f kube-flannel.yml
# 安装完成后,查看flannel pod状态
kubectl get pod --all-namespaces
3.2.7.将node节点加入集群(node节点操作)
# 在k8snode1、k8snode2、k8snode3、k8snode4节点都输入以下命令
# 注意这里要改成自己的,master节点初始化的输出内容
kubeadm join 192.168.10.10:6443 --token 91rgh7.fao3v8j30tbcr1el \
--discovery-token-ca-cert-hash sha256:35e9d72195a98a51571fe313aedd865b735f39fd3a4276d89faae0bf4c8aac89
# 查看集群节点状态(master节点执行)
kubectl get nodes
# 输出如下
NAME STATUS ROLES AGE VERSION
k8smaster Ready control-plane,master 21h v1.23.6
k8snode1 Ready <none> 20h v1.23.6
k8snode2 Ready <none> 20h v1.23.6
k8snode3 Ready <none> 20h v1.23.6
k8snode4 Ready <none> 20h v1.23.6
默认的join token有效期限为24小时,过期后该token就不能用了,这时需要重新创建token,创建新的join token需要在master节点上操作,命令如下:
kubeadm token create --print-join-command
3.3.安装其他组件
3.3.1.master节点配置k8s命令tab补全(可选)
正常安装了k8s后,使用kubec工具后接的命令是不能直接tab补全的,为了之后使用方便,建议配置一下
# 命令补全方法
yum -y install bash-completion
source /usr/share/bash-completion/bash_completion
source <(kubectl completion bash)
echo "source <(kubectl completion bash)" >> ~/.bashrc
bash
3.3.2.master节点部署Kuboard
Kuboard是一个Kubernetes可视化管理平台,它提供了一种简单易用的方式来管理和监控 Kubernetes集群。通过 Kuboard,用户可以轻松地部署、扩展和管理容器化应用程序,同时它还提供了一些高级功能,比如集群监控、日志管理、资源管理等。
kubectl apply -f https://addons.kuboard.cn/kuboard/kuboard-v3.yaml
安装完成后,浏览器访问http://192.168.10.10:30080/,这里的ip填master节点ip,默认账号admin,密码Kuboard123
标签:容器,Kubernetes,192.168,集群,master,K8S,com,节点 From: https://blog.csdn.net/XBona/article/details/143275889