kubernetes集群安装
<p></p><div class="toc"><div class="toc-container-header">目录</div><ul><li>一、基础简介</li><li>二、系统初始化</li><li>三、Kubeadm安装</li><li>四、node节点加入集群</li><li>五、参考</li></ul></div><p></p><h3 id="一基础简介">一、基础简介</h3>
<p>1、kubeadm是官方社区推出的一个用于快速部署 kubernetes 集群的工具,这个工具能通过两条指令完成一个kubernetes集群的部署</p>
<p>2、环境要求</p>
<ul>
<li>
<p>一台或多台机器,操作系统CentOS 7.x-86_x64</p>
</li>
<li>
<p>硬件配置:内存2GB或2G+,CPU 2核或CPU 2核+</p>
</li>
<li>
<p>集群内各个机器之间能相互通信</p>
</li>
<li>
<p>集群内各个机器可以访问外网,需要拉取镜像</p>
</li>
<li>
<p>禁止swap分区</p>
</li>
</ul>
<p>3、节点规划如下</p>
<table>
<thead>
<tr>
<th>主机名</th>
<th>ip地址</th>
<th>部署组件</th>
</tr>
</thead>
<tbody>
<tr>
<td>k8s-master01</td>
<td>192.168.3.17</td>
<td>kube-apiserver、kube-scheduler、kube-controller-manager、etcd、kubelet、kubeadm、kubectl</td>
</tr>
<tr>
<td>k8s-node01</td>
<td>192.168.3.18</td>
<td>kubelet、kubeadm、kubectl</td>
</tr>
<tr>
<td>k8s-node02</td>
<td>192.168.3.19</td>
<td>kubelet、kubeadm、kubectl</td>
</tr>
</tbody>
</table>
<p>4、组件介绍</p>
<ul>
<li>kube-apiserver:所有服务访问统一入口</li>
<li>kube-controller-manager:维持副本期望数目</li>
<li>kube-scheduler:负责介绍任务,选择合适的节点进行分配任务</li>
<li>etcd:键值对数据库储存K8S集群所有重要信息(持久化)</li>
<li>kubelet:直接跟容器引擎交互实现容器的生命周期管理</li>
<li>kube-proxy:负责写入规则至 iptables、ipvs 实现服务映射访问的</li>
<li>coredns:可以为集群中的SVC创建一个域名IP的对应关系解析</li>
<li>ingress-controller:官方只能实现四层代理,ingress 可以实现七层代理</li>
</ul>
<p>5、架构图<br>
<img src="https://img2022.cnblogs.com/blog/364454/202205/364454-20220514162005325-985199755.png" alt="" loading="lazy"></p>
<h3 id="二系统初始化">二、系统初始化</h3>
<p>1、设置主机名</p>
<pre><code># 在master节点执行
hostnamectl set-hostname k8s-master01
# 在work01节点执行
hostnamectl set-hostname k8s-node01
# 在work02节点执行
hostnamectl set-hostname k8s-node02
</code></pre>
<p>2、配置主机和IP映射</p>
<pre><code>cat >> /etc/hosts << EOF
192.168.3.17 k8s-master01
192.168.3.18 k8s-node01
192.168.3.19 k8s-node02
EOF
</code></pre>
<p>3、安装依赖包</p>
<pre><code>yum install -y conntrack ntpdate ntp ipvsadm ipset jq iptables curl sysstat libseccomp wget vim net-tools git
</code></pre>
<p>4、设置防火墙为iptables并设置空规则</p>
<pre><code># 关闭防火墙
systemctl stop firewalld && systemctl disable firewalld
# 清理防火墙规则,设置默认转发策略
iptables -F && iptables -X && iptables -F -t nat && iptables -X -t nat && iptables -P FORWARD ACCEPT
# 需要开启防火墙的可以走这一步
# systemctl stop firewalld && systemctl disable firewalld
# yum install -y iptables-services && systemctl start iptables && systemctl enable iptables && iptables -F && service iptables save
</code></pre>
<p>5、关闭 selinux 和 swap交换分区</p>
<ul>
<li>打开 /etc/fstab 注释掉 swap行,临时关闭:swapoff -a</li>
<li>打开 /etc/sysconfig/selinux,将SELINUX=enforcing修改为SELINUX=disabled,临时关闭:setenforce 0</li>
</ul>
<pre><code># 禁用swap分区
swapoff -a && sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
# 禁用 selinux
setenforce 0 && sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config
</code></pre>
<p>6、配置内核参数,将桥接的IPv4流量传递到iptables的链</p>
<pre><code># 加载模块
modprobe br_netfilter
cat > /etc/sysctl.d/kubernetes.conf << EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
fs.file-max=52706963
fs.nr_open=52706963
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF
# 重新加载配置
sysctl -p /etc/sysctl.d/kubernetes.conf
</code></pre>
<p>7、时间同步</p>
<pre><code>yum install ntpdate -y
ntpdate time.windows.com
</code></pre>
<p>8、关闭不需要的服务</p>
<pre><code>systemctl stop postfix && systemctl disable postfix
</code></pre>
<p>9、升级linux内核</p>
<ul>
<li>CentOS 7.x 系统自带的 3.10.x 内核存在一些 Bugs,导致运行的 Docker、Kubernetes 不稳定</li>
</ul>
<pre><code># 查看内核版本
cat /proc/version
# 升级版本
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
yum --enablerepo=elrepo-kernel install -y kernel-lt
#设置开机从新内核启动(设置如下图版本号)
grub2-set-default 'CentOS Linux (5.4.193-1.el7.elrepo.x86_64) 7 (Core)'
#重启电脑
shutdown -r now
</code></pre>
<ul>
<li>升级成功如下图<br>
<img src="https://img2022.cnblogs.com/blog/364454/202205/364454-20220514144247960-1872573243.png" alt="" loading="lazy"></li>
</ul>
<h3 id="三kubeadm安装">三、Kubeadm安装</h3>
<p>1、k8s配置使用ipvs为代理,kube-proxy开启ipvs的前置条件</p>
<pre><code># 加载模块
modprobe br_netfilter
cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack
modprobe -- br_netfilter
EOF
# 修改访问权限
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules
</code></pre>
<p>2、配置国内yum源</p>
<pre><code>curl -o /etc/yum.repos.d/Centos-7.repo http://mirrors.aliyun.com/repo/Centos-7.repo
curl -o /etc/yum.repos.d/docker-ce.repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 或以下方式
# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
# rm -rf /var/cache/yum && yum makecache && yum -y update && yum -y autoremove
</code></pre>
<p>3、安装Docker</p>
<ul>
<li>一般在国内无法访问k8s.gcr.io,所以需要配置国内镜像托管站点</li>
<li>insecure-registries:配置为harbor地址,学习地址:https://www.cnblogs.com/lvlinguang/p/15500171.html</li>
</ul>
<pre><code># 安装必要的一些系统工具
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-ce
yum update -y && yum install -y docker-ce
# 创建docker目录
mkdir /etc/docker
# 配置daemon(添加 YUM 软件源)
cat > /etc/docker/daemon.json << EOF
{
"registry-mirrors": ["http://hub-mirror.c.163.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"insecure-registries":["192.168.3.12:6007"]
}
EOF
# 重启docker 服务
systemctl daemon-reload && systemctl restart docker && systemctl enable docker
#查看docker版本
docker --version
</code></pre>
<p>4、配置k8s的阿里云yum源</p>
<pre><code>cat > /etc/yum.repos.d/kubernetes.repo <<EOF
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
</code></pre>
<p>5、安装 kubeadm、kubelet 和 kubectl , 每个节点都需要安装</p>
<ul>
<li>Kubelet:运行在cluster所有节点上,负责启动pod和容器</li>
<li>Kubeadm:用于初始化cluster的一个工具</li>
<li>Kubectl:命令行工具,通过kubectl可以部署和管理应用,查看各种资源,创建,删除和更新组件</li>
</ul>
<pre><code># 安装指定版本
yum install -y kubelet-1.23.1 kubeadm-1.23.1 kubectl-1.23.1 --disableexcludes=kubernetes
# 安装最新版本
# yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
# 启动 kubelet 服务
systemctl start kubelet && systemctl enable kubelet
# 查看已经安装的版本
kubelet --version
</code></pre>
<p>6、初始化主节点(只在master节点上执行)</p>
<ul>
<li>kubernetes-version:K8s版本,与上面安装的一致</li>
<li>apiserver-advertise-address:master主机内网IP地址</li>
<li>image-repository:指定阿里云镜像仓库地址。由于kubeadm 默认从官网http://k8s.grc.io下载所需镜像,国内无法访问,因此需要指定阿里云镜像仓库地址</li>
<li>service-cidr:集群内部虚拟网络,Pod统一访问入口</li>
<li>pod-network-cidr: 定义pod网段为:10.244.0.0/16</li>
</ul>
<pre><code>kubeadm init \
--kubernetes-version=1.23.1 \
--apiserver-advertise-address=192.168.3.17 \
--image-repository registry.aliyuncs.com/google_containers \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
</code></pre>
<ul>
<li>如果安装报错,可以通过以下命令查看日志</li>
</ul>
<pre><code>journalctl -xeu kubelet
或者
journalctl -xeu kubelet -l
</code></pre>
<ul>
<li>安装完成,如下图<br>
<img src="https://img2022.cnblogs.com/blog/364454/202205/364454-20220514144317769-1193487074.png" alt="" loading="lazy"></li>
</ul>
<p>7、配置Kubectl工具</p>
<pre><code>mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
</code></pre>
<p>8、查看集群状态</p>
<ul>
<li>通过以下命令查看集群信息,发现已经有master01节点了,但是状态为:NotReady,原因为未安装flannel插件,如下图</li>
</ul>
<pre><code># 查看节点状态
kubectl get node
# 查看system下的pods
kubectl get pods -n kube-system
</code></pre>
<p><img src="https://img2022.cnblogs.com/blog/364454/202205/364454-20220514144333773-1573591844.png" alt="" loading="lazy"><br>
<img src="https://img2022.cnblogs.com/blog/364454/202205/364454-20220514144341536-1777408135.png" alt="" loading="lazy"></p>
<p>9、部署 Flannel网络</p>
<pre><code>kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
# 如果这个文件无法访问,可以直接下载下来,然后在本地运行
# github下载地址
# https://github.com/flannel-io/flannel/blob/master/Documentation/kube-flannel.yml
# 运行资源文件
# kubectl apply -f kube-flannel.yml
</code></pre>
<ul>
<li>执行后,需要等待一会,直到flannel和coredns运行即可,如下图</li>
</ul>
<pre><code># 查看pod实时更新状态
kubectl get pod -n kube-system -w
</code></pre>
<p><img src="https://img2022.cnblogs.com/blog/364454/202205/364454-20220514144418622-1057939379.png" alt="" loading="lazy"><br>
<img src="https://img2022.cnblogs.com/blog/364454/202205/364454-20220514144425253-255959226.png" alt="" loading="lazy"><br>
<img src="https://img2022.cnblogs.com/blog/364454/202205/364454-20220514144436138-1025878803.png" alt="" loading="lazy"></p>
<p>10、部署 Ingress</p>
<p>10.1、yaml部署</p>
<pre><code>wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.2.0/deploy/static/provider/baremetal/deploy.yaml
#修改镜像,因为k8s.gcr.io的镜像国内没法下载,所以替换成阿里云的镜像
registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.2.0
registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.1.1
# 安装运行
kubectl apply -f deploy.yaml
</code></pre>
<p>10.2、hostNetwork模式</p>
<p>默认情况下,我们只能通过它的30689端口访问,通过以下配置可以用80端口或域名访问</p>
<ul>
<li>在yaml文件中增加 hostNetwork: true</li>
<li>集群部署时,需要指定ingress调度到哪个节点,一般是域名解析的服务器(master节点),通过配置nodeName或nodeSelector指定节点调度,否则pod调度到其它node节点,你将可能无法访问。</li>
<li>我们可以通过以下命令查看ingress的访问端口</li>
</ul>
<pre><code>kubectl get service -n ingress-nginx
</code></pre>
<p><img src="https://img2022.cnblogs.com/blog/364454/202207/364454-20220718140916012-302896955.png" alt="" loading="lazy"></p>
<p>11、百度网盘相关下载</p>
<ul>
<li>kube-flannel.yml</li>
<li>ingress-nginx-1.2.0.yaml</li>
</ul>
<p>链接:https://pan.baidu.com/s/1Bz0c9lCLtt19ChY69DK12Q<br>
提取码:trxe</p>
<h3 id="四node节点加入集群">四、node节点加入集群</h3>
<p>1、master节点创建token</p>
<pre><code>kubeadm token create --print-join-command
# 查询token列表
# kubeadm token list
# token永不失效
# kubeadm token create --ttl 0
</code></pre>
<p>如图:<br>
<img src="https://img2022.cnblogs.com/blog/364454/202205/364454-20220514144510373-535347511.png" alt="" loading="lazy"></p>
<p>2、node节点执行kubeadm join命令加入集群,如下图</p>
<pre><code>kubeadm join 192.168.3.17:6443 --token 2yedu7.ouajpjva3kb8pib0 \
--discovery-token-ca-cert-hash sha256:8d799bd680ea04626d3146d5cd37aee2b8623bc4ec92050a6d620f93e4e38fe7
</code></pre>
<p><img src="https://img2022.cnblogs.com/blog/364454/202205/364454-20220514144750394-1556402647.png" alt="" loading="lazy"></p>
<p>3、在master节点上查看node状态,发现已经有node01节点了,状态为NotReady,需要等待flannel初始化完成即可,如下图<br>
<img src="https://img2022.cnblogs.com/blog/364454/202205/364454-20220514144802878-1384723488.png" alt="" loading="lazy"><br>
<img src="https://img2022.cnblogs.com/blog/364454/202205/364454-20220514144811313-1272648086.png" alt="" loading="lazy"></p>
<h3 id="五参考">五、参考</h3>
<ul>
<li>安装参考一:https://blog.csdn.net/huang_dannier/article/details/122419447</li>
<li>安装参考二:https://www.yoyoask.com/?p=1724</li>
<li>安装参考三:https://blog.csdn.net/weixin_45444133/article/details/116952250</li>
<li>安装参考四:https://blog.csdn.net/xujiamin0022016/article/details/124648479</li>
<li>错误排查:https://www.cnblogs.com/blogxu/p/ip.html</li>
</ul><br><br>
来源:https://www.cnblogs.com/lvlinguang/p/16270133.html
頁:
[1]