Kubernetes 企业级集群部署方式
<h1>一、Kubernetes介绍与特性</h1><h2>1.1、kubernetes是什么</h2>
<p>官方网站:http://www.kubernetes.io</p>
<p>• Kubernetes是Google在2014年开源的一个容器集群管理系统,Kubernetes简称K8S。 <br>• K8S用于容器化应用程序的部署,扩展和管理。 <br>• K8S提供了容器编排,资源调度,弹性伸缩,部署管理,服务发现等一系列功能。<br>• Kubernetes目标是让部署容器化应用简单高效。</p>
<h2>1.2、kubernetes是什么</h2>
<p>一个容器平台<br>一个微服务平台<br>便捷式云平台</p>
<h2>1.3、kubernetes特性</h2>
<p><strong>- 自我修复</strong><br>在节点故障时重新启动失败的容器,替换和重新部署,保证预期的副本数量;杀死健康检查失败的容器,并且在未准备好之前不会处理客户端请求,确保线上服务不中断。<br><strong>- 弹性伸缩</strong><br>使用命令、UI或者基于CPU使用情况自动快速扩容和缩容应用程序实例,保证应用业务高峰并发时的高可用性;业务低峰时回收资源,以最小成本运行服务。 <br><strong>- 自动部署和回滚</strong><br>K8S采用滚动更新策略更新应用,一次更新一个Pod,而不是同时删除所有Pod,如果更新过程中出现问题,将回滚更改,确保升级不受影响业务。 <br><strong>- 服务发现和负载均衡</strong><br>K8S为多个容器提供一个统一访问入口(内部IP地址和一个DNS名称),并且负载均衡关联的所有容器,使得用户无需考虑容器IP问题。 <br><strong>- 机密和配置管理</strong><br>管理机密数据和应用程序配置,而不需要把敏感数据暴露在镜像里,提高敏感数据安全性。并可以将一些常用的配置存储在K8S中,方便应用程序使用。<br><strong>- 存储编排</strong><br>挂载外部存储系统,无论是来自本地存储,公有云(如AWS),还是网络存储(如NFS、GlusterFS、Ceph)都作为集群资源的一部分使用,极大提高存储使用灵活性。 <br><strong>- 批处理</strong><br>提供一次性任务,定时任务;满足批量数据处理和分析的场景。</p>
<h1>二、kubernetes组织架构介绍</h1>
<h2>2.1、整体架构组件详解</h2>
<p>1、如图,有三个节点一个master节点和两个node节点。<br>2、Master有三个组件:<br> - API server:K8S提供的一个统一的入口,提供RESTful API访问方式接口服务。<br> - Auth:认证授权,判断是否有权限访问<br> - Etcd:存储的数据库、存储认证信息等,K8S状态,节点信息等<br> - scheduler:集群的调度,将集群分配到哪个节点内<br> - controller manager: 控制器,来控制来做哪些任务,管理 pod service 控制器等<br> - Kubectl:管理工具,直接管理API Server,期间会有认证授权。<br>3、Node有两个组件:<br> - kubelet:接收K8S下发的任务,管理容器创建,生命周期管理等,将一个pod转换成一组容器。<br> - kube-proxy:Pod网络代理,四层负载均衡,对外访问<br> - 用户 -> 防火墙 -> kube-proxy -> 业务<br> Pod:K8S最小单元<br> - Container:运行容器的环境,运行容器引擎<br> - Docker</p>
<p><img src="https://img2018.cnblogs.com/blog/1183448/201908/1183448-20190826070856495-56128924.png" alt="" width="836" height="449"></p>
<h2>2.2、集群管理流程及核心概念</h2>
<p>1、 管理集群流程</p>
<p><img src="https://img2018.cnblogs.com/blog/1183448/201908/1183448-20190826071009558-581778358.png" alt=""></p>
<p>2、Kubernetes核心概念</p>
<p> <img src="https://img2018.cnblogs.com/blog/1183448/201908/1183448-20190826071112265-371701075.png" alt=""></p>
<p><strong>Pod</strong><br> • 最小部署单元<br> • 一组容器的集合<br> • 一个Pod中的容器共享网络命名空间<br> • Pod是短暂的<br><strong>Controllers</strong><br> • ReplicaSet : 确保预期的Pod副本数量<br> • Deployment : 无状态应用部署<br> • StatefulSet : 有状态应用部署<br> • DaemonSet : 确保所有Node运行同一个Pod<br> • Job : 一次性任务<br> • Cronjob : 定时任务<br> 注:更高级层次对象,部署和管理Pod</p>
<p><strong>Service</strong><br> • 防止Pod失联<br> • 定义一组Pod的访问策略</p>
<p><strong>Label</strong> : 标签,附加到某个资源上,用于关联对象、查询和筛选</p>
<p><strong>Namespaces</strong> : 命名空间,将对象逻辑上隔离</p>
<p><strong>Annotations</strong> :注释</p>
<h1> 三、Kubernetes 部署</h1>
<ul>
<li><span style="color: rgba(255, 0, 0, 1)"><strong># K8S 相关服务包</strong></span></li>
<li>百度云下载:https://pan.baidu.com/s/1d1zqoil3pfeThC-v45bWkg</li>
<li>密码:0ssx</li>
</ul>
<h2>3.1 服务版本及架构说明</h2>
<p><strong>服务版本</strong></p>
<ul>
<li>centos:7.4</li>
<li>etcd-v3.3.10</li>
<li>flannel-v0.10.0</li>
<li>kubernetes-1.12.1</li>
<li>nginx-1.16.1</li>
<li>keepalived-1.3.5</li>
<li>docker-19.03.1</li>
</ul>
<p><strong>单Master架构</strong></p>
<ul>
<li>k8s Master:172.16.105.220</li>
<li>k8s Node:172.16.105.230、172.16.105.213</li>
<li>etcd:172.16.105.220、172.16.105.230、172.16.105.213</li>
</ul>
<p><strong>双Master+Nginx+Keepalived</strong></p>
<ul>
<li>k8s Master1:192.168.1.108</li>
<li>k8s Master2:192.168.1.109</li>
<li>k8s Node3:192.168.1.110</li>
<li>k8s Node4:192.168.1.111</li>
<li>etc:192.168.1.108、192.168.1.109、192.168.1.110、192.168.1.111</li>
<li>Nginx+keepalived1:192.168.1.112</li>
<li>Nginx+keepalived2:192.168.1.113</li>
<li>vip:192.168.1.100</li>
</ul>
<p> </p>
<h2>3.2、部署kubernetes准备</h2>
<p>1、关闭防火墙</p>
<div class="cnblogs_code">
<pre>systemctl stop firewalld.service</pre>
</div>
<p>2、关闭SELINUX</p>
<div class="cnblogs_code">
<pre>setenforce <span style="color: rgba(128, 0, 128, 1)">0</span></pre>
</div>
<p>3、修改主机名</p>
<div class="cnblogs_code">
<pre>vim /etc/<span style="color: rgba(0, 0, 0, 1)">hostname
hostname </span>****</pre>
</div>
<p>4、同步时间</p>
<div class="cnblogs_code">
<pre>ntpdate time.windows.com</pre>
</div>
<p>5、环境变量</p>
<p>注:下面配置所有用到的k8s最好部署环境变量</p>
<h2>3.3、Etcd 数据库集群部署</h2>
<h3><span style="font-size: 18px"><strong>1、部署 Etcd 自签证书 </strong></span></h3>
<p>1、创建k8s及证书目录</p>
<div class="cnblogs_code">
<pre>mkdir ~/k8s && cd ~/<span style="color: rgba(0, 0, 0, 1)">k8s
mkdir k8s</span>-<span style="color: rgba(0, 0, 0, 1)">cert
mkdir etcd</span>-<span style="color: rgba(0, 0, 0, 1)">cert
cd etcd</span>-cert</pre>
</div>
<p>2、安装cfssl生成证书工具</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 通过选项生成证书</span>
curl -L https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -o /usr/local/bin/<span style="color: rgba(0, 0, 0, 1)">cfssl
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 通过json生成证书</span>
curl -L https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -o /usr/local/bin/<span style="color: rgba(0, 0, 0, 1)">cfssljson
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 查看证书信息</span>
curl -L https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -o /usr/local/bin/cfssl-<span style="color: rgba(0, 0, 0, 1)">certinfo
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 添加执行权限</span>
chmod +x /usr/local/bin/cfssl /usr/local/bin/cfssljson /usr/local/bin/cfssl-<span style="color: rgba(0, 0, 0, 1)">certinfo</span></pre>
</div>
<p>3、执行命令生成证书使用的json文件1</p>
<div class="cnblogs_code"><img id="code_img_closed_471f1397-a8eb-4798-904a-883f88d66fc9" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_471f1397-a8eb-4798-904a-883f88d66fc9" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_471f1397-a8eb-4798-904a-883f88d66fc9" class="cnblogs_code_hide">
<pre>vim ca-<span style="color: rgba(0, 0, 0, 1)">config.json
{
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">signing</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: {
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">default</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: {
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">expiry</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">87600h</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
},
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">profiles</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: {
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">www</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: {
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">expiry</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">87600h</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">usages</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: [
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">signing</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">key encipherment</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">server auth</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">client auth</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
]
}
}
}
}</span></pre>
</div>
<span class="cnblogs_code_collapse">vim ca-config.json</span></div>
<p>4、执行命令生成证书使用的json文件2</p>
<div class="cnblogs_code"><img id="code_img_closed_8a1a0be1-22ba-4c50-8de3-baa7055e116c" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_8a1a0be1-22ba-4c50-8de3-baa7055e116c" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_8a1a0be1-22ba-4c50-8de3-baa7055e116c" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">CN</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">etcd CA</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">key</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: {
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">algo</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">rsa</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">size</span><span style="color: rgba(128, 0, 0, 1)">"</span>: 2048<span style="color: rgba(0, 0, 0, 1)">
},
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">names</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: [
{
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">C</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">CN</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">L</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Beijing</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ST</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Beijing</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
}
]
}</span></pre>
</div>
<span class="cnblogs_code_collapse">vim ca-csr.json</span></div>
<p>5、执行命令通过json文件生成CA根证书、会在当前目录生成ca.pem和ca-key.pem</p>
<div class="cnblogs_code">
<pre>cfssl gencert -initca ca-csr.json | cfssljson -bare ca -</pre>
</div>
<p>6、执行命令生成Etcd域名证书、首先创建json文件后生成</p>
<div class="cnblogs_code"><img id="code_img_closed_4961da7b-b1f9-44a2-82c0-6606df5c3b56" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_4961da7b-b1f9-44a2-82c0-6606df5c3b56" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_4961da7b-b1f9-44a2-82c0-6606df5c3b56" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">CN</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">etcd</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">hosts</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: [
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">172.16.105.220</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">172.16.105.230</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">172.16.105.213</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
],
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">key</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: {
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">algo</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">rsa</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">size</span><span style="color: rgba(128, 0, 0, 1)">"</span>: 2048<span style="color: rgba(0, 0, 0, 1)">
},
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">names</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: [
{
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">C</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">CN</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">L</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">BeiJing</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ST</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">BeiJing</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
}
]
}</span></pre>
</div>
<span class="cnblogs_code_collapse">vim server-csr.json</span></div>
<p>注:hosts下面跟etcd部署服务的IP。</p>
<p>7、执行命令办法Etcd域名证书、当前目录下生成 server.pem 与 server-key.pem</p>
<div class="cnblogs_code">
<pre>cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=www server-csr.json | cfssljson -bare server</pre>
</div>
<p>8、查看创建的证书</p>
<div class="cnblogs_code">
<pre>ls *<span style="color: rgba(0, 0, 0, 1)">pem
ca</span>-key.pemca.pemserver-key.pemserver.pem</pre>
</div>
<h3><span style="font-size: 18px"><strong>2、部署 Etcd 数据库集群</strong></span></h3>
<ul>
<li>使用etcd版本:etcd-v3.3.10-linux-amd64.tar.gz</li>
<li>二进制包下载地址:https://github.com/coreos/etcd/releases/tag/v3.2.12</li>
</ul>
<p>1、下载本地后进行解压、进入到解压目录</p>
<div class="cnblogs_code">
<pre>tar zxvf etcd-v3.3.10-linux-<span style="color: rgba(0, 0, 0, 1)">amd64.tar.gz
cd etcd</span>-v3.3.10-linux-amd64</pre>
</div>
<p>2、为了方便管理etcd创建几个目录、并移动文件</p>
<div class="cnblogs_code">
<pre>mkdir /opt/etcd/{cfg,bin,ssl} -<span style="color: rgba(0, 0, 0, 1)">p
mv etcd etcdctl </span>/opt/etcd/bin/</pre>
</div>
<p>3、创建编写etcd配置文件</p>
<div class="cnblogs_code"><img id="code_img_closed_dcfecfdb-9f1a-45c1-9ded-331550133c5f" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_dcfecfdb-9f1a-45c1-9ded-331550133c5f" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_dcfecfdb-9f1a-45c1-9ded-331550133c5f" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"></span>
ETCD_NAME=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">etcd01</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
ETCD_DATA_DIR</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/var/lib/etcd/default.etcd</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
ETCD_LISTEN_PEER_URLS</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">https://172.16.105.220:2380</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
ETCD_LISTEN_CLIENT_URLS</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">https://172.16.105.220:2379</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"></span>
ETCD_INITIAL_ADVERTISE_PEER_URLS=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">https://172.16.105.220:2380</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
ETCD_ADVERTISE_CLIENT_URLS</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">https://172.16.105.220:2379</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
ETCD_INITIAL_CLUSTER</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">etcd01=https://172.16.105.220:2380,etcd02=https://172.16.105.230:2380,etcd03=https://172.16.105.213:2380</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
ETCD_INITIAL_CLUSTER_TOKEN</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">etcd-cluster</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
ETCD_INITIAL_CLUSTER_STATE</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">new</span><span style="color: rgba(128, 0, 0, 1)">"</span></pre>
</div>
<span class="cnblogs_code_collapse">vim /opt/etcd/cfg/etcd </span></div>
<div class="cnblogs_code"><img id="code_img_closed_4fe44c99-aa6f-4d19-ac56-cf5867bf564a" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_4fe44c99-aa6f-4d19-ac56-cf5867bf564a" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_4fe44c99-aa6f-4d19-ac56-cf5867bf564a" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">· ETCD_NAME 节点名称
· ETCD_DATA_DIR 数据目录
· ETCD_LISTEN_PEER_URLS 集群通信监听地址
· ETCD_LISTEN_CLIENT_URLS 客户端访问监听地址
· ETCD_INITIAL_ADVERTISE_PEER_URLS 集群通告地址
· ETCD_ADVERTISE_CLIENT_URLS 客户端通告地址
· ETCD_INITIAL_CLUSTER 集群节点地址
· ETCD_INITIAL_CLUSTER_TOKEN 集群Token
· ETCD_INITIAL_CLUSTER_STATE 加入集群的当前状态,new是新集群,existing表示加入已有集群</span></pre>
</div>
<span class="cnblogs_code_collapse">参数含义</span></div>
<p>4、创建systemd 管理 etcd</p>
<div class="cnblogs_code"><img id="code_img_closed_8e1da762-98c3-4ded-8b90-41b08b82bc3f" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_8e1da762-98c3-4ded-8b90-41b08b82bc3f" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_8e1da762-98c3-4ded-8b90-41b08b82bc3f" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">
Description</span>=<span style="color: rgba(0, 0, 0, 1)">Etcd Server
After</span>=<span style="color: rgba(0, 0, 0, 1)">network.target
After</span>=network-<span style="color: rgba(0, 0, 0, 1)">online.target
Wants</span>=network-<span style="color: rgba(0, 0, 0, 1)">online.target
Type</span>=<span style="color: rgba(0, 0, 0, 1)">notify
EnvironmentFile</span>=/opt/etcd/cfg/<span style="color: rgba(0, 0, 0, 1)">etcd
ExecStart</span>=/opt/etcd/bin/<span style="color: rgba(0, 0, 0, 1)">etcd \
</span>--name=<span style="color: rgba(0, 0, 0, 1)">${ETCD_NAME} \
</span>--data-dir=<span style="color: rgba(0, 0, 0, 1)">${ETCD_DATA_DIR} \
</span>--listen-peer-urls=<span style="color: rgba(0, 0, 0, 1)">${ETCD_LISTEN_PEER_URLS} \
</span>--listen-client-urls=${ETCD_LISTEN_CLIENT_URLS},http://127.0.0.1:2379<span style="color: rgba(0, 0, 0, 1)"> \
</span>--advertise-client-urls=<span style="color: rgba(0, 0, 0, 1)">${ETCD_ADVERTISE_CLIENT_URLS} \
</span>--initial-advertise-peer-urls=<span style="color: rgba(0, 0, 0, 1)">${ETCD_INITIAL_ADVERTISE_PEER_URLS} \
</span>--initial-cluster=<span style="color: rgba(0, 0, 0, 1)">${ETCD_INITIAL_CLUSTER} \
</span>--initial-cluster-token=<span style="color: rgba(0, 0, 0, 1)">${ETCD_INITIAL_CLUSTER_TOKEN} \
</span>--initial-cluster-state=<span style="color: rgba(0, 0, 0, 1)">new \
</span>--cert-file=/opt/etcd/ssl/<span style="color: rgba(0, 0, 0, 1)">server.pem \
</span>--key-file=/opt/etcd/ssl/server-<span style="color: rgba(0, 0, 0, 1)">key.pem \
</span>--peer-cert-file=/opt/etcd/ssl/<span style="color: rgba(0, 0, 0, 1)">server.pem \
</span>--peer-key-file=/opt/etcd/ssl/server-<span style="color: rgba(0, 0, 0, 1)">key.pem \
</span>--trusted-ca-file=/opt/etcd/ssl/<span style="color: rgba(0, 0, 0, 1)">ca.pem \
</span>--peer-trusted-ca-file=/opt/etcd/ssl/<span style="color: rgba(0, 0, 0, 1)">ca.pem
Restart</span>=on-<span style="color: rgba(0, 0, 0, 1)">failure
LimitNOFILE</span>=65536<span style="color: rgba(0, 0, 0, 1)">
WantedBy</span>=multi-user.target</pre>
</div>
<span class="cnblogs_code_collapse">vim /usr/lib/systemd/system/etcd.service</span></div>
<p>5、将证书文件copy到指定目录</p>
<div class="cnblogs_code">
<pre>cp /root/k8s/etcd-cert/{ca,ca-key,server-key,server}.pem /opt/etcd/ssl/</pre>
</div>
<p>6、启动 etcd、并设置开机自启动</p>
<div class="cnblogs_code">
<pre>systemctl daemon-<span style="color: rgba(0, 0, 0, 1)">reload
systemctl enable etcd.service
systemctl start etcd.service</span></pre>
</div>
<p>7、开启后etcd可能会等待其他两个节点等待,需要讲其他两个节点etcd开启</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 1、将目录etcd配置目录 copy 到两个节点内</span>
scp -r /opt/etcd/ root@172.16.105.230:/opt/<span style="color: rgba(0, 0, 0, 1)">
scp </span>-r /opt/etcd/ root@172.16.105.213:/opt/
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 2、将启动服务配置文件 copy 到两个节点内</span>
scp -r /usr/lib/systemd/system/etcd.service root@172.16.105.230:/usr/lib/systemd/system/<span style="color: rgba(0, 0, 0, 1)">
scp </span>-r /usr/lib/systemd/system/etcd.service root@172.16.105.213:/usr/lib/systemd/system/</pre>
</div>
<p>8、修改 两个节点 etcd /opt/etcd/cfg/etcd 配置文件</p>
<div class="cnblogs_code"><img id="code_img_closed_dd6b6bef-c9c3-4bc5-b244-1f909e784042" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_dd6b6bef-c9c3-4bc5-b244-1f909e784042" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_dd6b6bef-c9c3-4bc5-b244-1f909e784042" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"></span>
ETCD_NAME=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">etcd02</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
ETCD_DATA_DIR</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/var/lib/etcd/default.etcd</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
ETCD_LISTEN_PEER_URLS</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">https://172.16.105.230:2380</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
ETCD_LISTEN_CLIENT_URLS</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">https://172.16.105.230:2379</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"></span>
ETCD_INITIAL_ADVERTISE_PEER_URLS=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">https://172.16.105.230:2380</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
ETCD_ADVERTISE_CLIENT_URLS</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">https://172.16.105.230:2379</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
ETCD_INITIAL_CLUSTER</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">etcd01=https://172.16.105.220:2380,etcd02=https://172.16.105.230:2380,etcd03=https://172.16.105.213:2380</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
ETCD_INITIAL_CLUSTER_TOKEN</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">etcd-cluster</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
ETCD_INITIAL_CLUSTER_STATE</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">new</span><span style="color: rgba(128, 0, 0, 1)">"</span></pre>
</div>
<span class="cnblogs_code_collapse">节点:172.16.105.230 配置文件</span></div>
<div class="cnblogs_code"><img id="code_img_closed_7ca22308-a2b8-4563-b064-319e7063005c" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_7ca22308-a2b8-4563-b064-319e7063005c" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_7ca22308-a2b8-4563-b064-319e7063005c" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"></span>
ETCD_NAME=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">etcd03</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
ETCD_DATA_DIR</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/var/lib/etcd/default.etcd</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
ETCD_LISTEN_PEER_URLS</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">https://172.16.105.213:2380</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
ETCD_LISTEN_CLIENT_URLS</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">https://172.16.105.213:2379</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"></span>
ETCD_INITIAL_ADVERTISE_PEER_URLS=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">https://172.16.105.213:2380</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
ETCD_ADVERTISE_CLIENT_URLS</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">https://172.16.105.213:2379</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
ETCD_INITIAL_CLUSTER</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">etcd01=https://172.16.105.220:2380,etcd02=https://172.16.105.230:2380,etcd03=https://172.16.105.213:2380</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
ETCD_INITIAL_CLUSTER_TOKEN</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">etcd-cluster</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
ETCD_INITIAL_CLUSTER_STATE</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">new</span><span style="color: rgba(128, 0, 0, 1)">"</span></pre>
</div>
<span class="cnblogs_code_collapse">节点:172.16.105.213 配置文件</span></div>
<p>9、两个节点启动服务、并设置开机自启动</p>
<div class="cnblogs_code">
<pre>systemctl daemon-<span style="color: rgba(0, 0, 0, 1)">reload
systemctl enable etcd.service
systemctl start etcd.service</span></pre>
</div>
<p>10、查看主etcd日志</p>
<div class="cnblogs_code"><img id="code_img_closed_8d2e5de7-4ab6-4505-bfd3-4784404b6a5d" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_8d2e5de7-4ab6-4505-bfd3-4784404b6a5d" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_8d2e5de7-4ab6-4505-bfd3-4784404b6a5d" class="cnblogs_code_hide">
<pre>Aug6 11:13:54 izbp14x4an2p4z7awyek7mz etcd: updating the cluster version <span style="color: rgba(0, 0, 255, 1)">from</span> 3.0 to 3.3<span style="color: rgba(0, 0, 0, 1)">
Aug</span>6 11:13:54 izbp14x4an2p4z7awyek7mz etcd: updated the cluster version <span style="color: rgba(0, 0, 255, 1)">from</span> 3.0 to 3.3<span style="color: rgba(0, 0, 0, 1)">
Aug</span>6 11:13:54 izbp14x4an2p4z7awyek7mz etcd: enabled capabilities <span style="color: rgba(0, 0, 255, 1)">for</span> version 3.3</pre>
</div>
<span class="cnblogs_code_collapse">tail /var/log/messages -f</span></div>
<p>11、查看端口启动</p>
<div class="cnblogs_code"><img id="code_img_closed_688a5c0c-d463-4d0e-a13f-e936b7d41497" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_688a5c0c-d463-4d0e-a13f-e936b7d41497" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_688a5c0c-d463-4d0e-a13f-e936b7d41497" class="cnblogs_code_hide">
<pre>tcp 0 0 172.16.105.220:2379 0.0.0.0:* LISTEN 13021/<span style="color: rgba(0, 0, 0, 1)">etcd
tcp 0 0 </span>127.0.0.1:2379 0.0.0.0:* LISTEN 13021/<span style="color: rgba(0, 0, 0, 1)">etcd
tcp 0 0 </span>172.16.105.220:2380 0.0.0.0:* LISTEN 13021/etcd </pre>
</div>
<span class="cnblogs_code_collapse">netstat -lnpt</span></div>
<p>12、查看进程使用</p>
<div class="cnblogs_code"><img id="code_img_closed_85157f13-2ed1-48bc-8e43-c4ac3822f9d0" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_85157f13-2ed1-48bc-8e43-c4ac3822f9d0" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_85157f13-2ed1-48bc-8e43-c4ac3822f9d0" class="cnblogs_code_hide">
<pre>root 130211.11.4 10541908 28052 ? Ssl11:13 0:02 /opt/etcd/bin/etcd --name=etcd01 --data-dir=/var/lib/etcd/default.etcd --listen-peer-urls=https://172.16.105.220:2380 --listen-client-urls=https://172.16.105.220:2379,http://127.0.0.1:2379 --advertise-client-urls=https://172.16.105.220:2379 --initial-advertise-peer-urls=https://172.16.105.220:2380 --initial-cluster=etcd01=https://172.16.105.220:2380,etcd02=https://172.16.105.230:2380,etcd03=https://172.16.105.213:2380 --initial-cluster-token=etcd-cluster --initial-cluster-state=new --cert-file=/opt/etcd/ssl/server.pem --key-file=/opt/etcd/ssl/server-key.pem --peer-cert-file=/opt/etcd/ssl/server.pem --peer-key-file=/opt/etcd/ssl/server-key.pem --trusted-ca-file=/opt/etcd/ssl/ca.pem --peer-trusted-ca-file=/opt/etcd/ssl/ca.pem</pre>
</div>
<span class="cnblogs_code_collapse">ps -aux | grep etcd</span></div>
<p>13、通过工具验证etcd</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 添加证书文件绝对路径与etcd集群节点地址</span>
/opt/etcd/bin/etcdctl --ca-file=/opt/etcd/ssl/ca.pem --cert-file=/opt/etcd/ssl/server.pem --key-file=/opt/etcd/ssl/server-key.pem --endpoints=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">https://172.16.105.220:2379,https://172.16.105.230:2379,https://172.16.105.213:2379</span><span style="color: rgba(128, 0, 0, 1)">"</span> cluster-health</pre>
</div>
<div class="cnblogs_code"><img id="code_img_closed_deb8d394-74d3-44b8-a46b-1cf35677e960" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_deb8d394-74d3-44b8-a46b-1cf35677e960" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_deb8d394-74d3-44b8-a46b-1cf35677e960" class="cnblogs_code_hide">
<pre>member 1d5fcc16a8c9361e <span style="color: rgba(0, 0, 255, 1)">is</span> healthy: got healthy result <span style="color: rgba(0, 0, 255, 1)">from</span> https://172.16.105.220:2379<span style="color: rgba(0, 0, 0, 1)">
member 7b28469233594fbd </span><span style="color: rgba(0, 0, 255, 1)">is</span> healthy: got healthy result <span style="color: rgba(0, 0, 255, 1)">from</span> https://172.16.105.230:2379<span style="color: rgba(0, 0, 0, 1)">
member b2e216e703023e21 </span><span style="color: rgba(0, 0, 255, 1)">is</span> healthy: got healthy result <span style="color: rgba(0, 0, 255, 1)">from</span> https://172.16.105.213:2379<span style="color: rgba(0, 0, 0, 1)">
cluster </span><span style="color: rgba(0, 0, 255, 1)">is</span> healthy</pre>
</div>
<span class="cnblogs_code_collapse">输出如下表示没问题:</span></div>
<p>其他:</p>
<div class="cnblogs_code"><img id="code_img_closed_612147ac-27ea-4ff2-bfd0-2376bfa23016" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_612147ac-27ea-4ff2-bfd0-2376bfa23016" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_612147ac-27ea-4ff2-bfd0-2376bfa23016" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 删除每个节点data文件重新启动</span>
rm -rf /var/lib/etcd/default.etcd</pre>
</div>
<span class="cnblogs_code_collapse">报错:etcd: request cluster ID mismatch</span></div>
<h2><strong>3.4、Node 部署 Docker 容器应用 </strong></h2>
<p>1、安装依赖包</p>
<div class="cnblogs_code">
<pre>yum install -y yum-utils device-mapper-persistent-data lvm2</pre>
</div>
<p>2、配置官方源</p>
<div class="cnblogs_code">
<pre>yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo</pre>
</div>
<p>3、安装docker最新版</p>
<div class="cnblogs_code">
<pre>yum -y install docker-ce</pre>
</div>
<p>4、配置docker仓库加速器</p>
<div class="cnblogs_code">
<pre>官网:https://www.daocloud.io/<span style="color: rgba(0, 0, 0, 1)">mirror
加速命令:curl </span>-sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io</pre>
</div>
<p>5、重启docker</p>
<div class="cnblogs_code">
<pre>systemctl restart docker</pre>
</div>
<p>6、查看docker版本:docker version</p>
<div class="cnblogs_code">
<pre>Version: 19.03.1</pre>
</div>
<h2>3.5、Node 部署 Flannel 网络模型</h2>
<ul>
<li>二进制包:https://github.com/coreos/flannel/releases</li>
</ul>
<p>1、写入分配的子网到etcd、提供flanneld使用。</p>
<div class="cnblogs_code">
<pre>/opt/etcd/bin/etcdctl --ca-file=/opt/etcd/ssl/ca.pem --cert-file=/opt/etcd/ssl/server.pem --key-file=/opt/etcd/ssl/server-key.pem --endpoints=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">https://172.16.105.220:2379,https://172.16.105.230:2379,https://172.16.105.213:2379</span><span style="color: rgba(128, 0, 0, 1)">"</span> set /coreos.com/network/config <span style="color: rgba(128, 0, 0, 1)">'</span><span style="color: rgba(128, 0, 0, 1)">{ "Network": "172.17.0.0/16", "Backend": {"Type": "vxlan"}}</span><span style="color: rgba(128, 0, 0, 1)">'</span></pre>
</div>
<p>2、查看创建网络信息</p>
<div class="cnblogs_code">
<pre>/opt/etcd/bin/etcdctl --ca-file=/opt/etcd/ssl/ca.pem --cert-file=/opt/etcd/ssl/server.pem --key-file=/opt/etcd/ssl/server-key.pem --endpoints=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">https://172.16.105.220:2379,https://172.16.105.230:2379,https://172.16.105.213:2379</span><span style="color: rgba(128, 0, 0, 1)">"</span> get /coreos.com/network/config</pre>
</div>
<p>3、下载完flannel包后进行解压</p>
<div class="cnblogs_code">
<pre>tar -xvzf flannel-v0.10.0-linux-amd64.tar.gz</pre>
</div>
<p>4、创建目录将文件存放到指定目录下</p>
<div class="cnblogs_code">
<pre>mkdir -p /opt/kubernetes/<span style="color: rgba(0, 0, 0, 1)">{bin,cfg,ssl}
mv flanneld mk</span>-docker-opts.sh /opt/kubernetes/bin/</pre>
</div>
<p>5、创建flanneld配置文件</p>
<div class="cnblogs_code"><img id="code_img_closed_4f51d6af-1415-4df7-810f-12cfa9e4d161" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_4f51d6af-1415-4df7-810f-12cfa9e4d161" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_4f51d6af-1415-4df7-810f-12cfa9e4d161" class="cnblogs_code_hide">
<pre>FLANNEL_OPTIONS=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">--etcd-endpoints=https://172.16.105.220:2379,https://172.16.105.230:2379,https://172.16.105.213:2379 -etcd-cafile=/opt/etcd/ssl/ca.pem -etcd-certfile=/opt/etcd/ssl/server.pem -etcd-keyfile=/opt/etcd/ssl/server-key.pem</span><span style="color: rgba(128, 0, 0, 1)">"</span></pre>
</div>
<span class="cnblogs_code_collapse">vim /opt/kubernetes/cfg/flanneld</span></div>
<p>6、创建systemd管理flannel</p>
<div class="cnblogs_code"><img id="code_img_closed_76209447-e29d-47e6-932b-49f851690c9e" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_76209447-e29d-47e6-932b-49f851690c9e" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_76209447-e29d-47e6-932b-49f851690c9e" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">
Description</span>=<span style="color: rgba(0, 0, 0, 1)">Flanneld overlay address etcd agent
After</span>=network-<span style="color: rgba(0, 0, 0, 1)">online.target network.target
Before</span>=<span style="color: rgba(0, 0, 0, 1)">docker.service
Type</span>=<span style="color: rgba(0, 0, 0, 1)">notify
EnvironmentFile</span>=/opt/kubernetes/cfg/<span style="color: rgba(0, 0, 0, 1)">flanneld
ExecStart</span>=/opt/kubernetes/bin/flanneld --ip-<span style="color: rgba(0, 0, 0, 1)">masq $FLANNEL_OPTIONS
ExecStartPost</span>=/opt/kubernetes/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/<span style="color: rgba(0, 0, 0, 1)">subnet.env
Restart</span>=on-<span style="color: rgba(0, 0, 0, 1)">failure
WantedBy</span>=multi-user.target</pre>
</div>
<span class="cnblogs_code_collapse">vim /usr/lib/systemd/system/flanneld.service</span></div>
<p>7、配置Docker启动指定网段</p>
<div class="cnblogs_code"><img id="code_img_closed_567aa932-da1c-4fee-a258-3c872683deb6" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_567aa932-da1c-4fee-a258-3c872683deb6" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_567aa932-da1c-4fee-a258-3c872683deb6" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">
Description</span>=<span style="color: rgba(0, 0, 0, 1)">Docker Application Container Engine
Documentation</span>=https://<span style="color: rgba(0, 0, 0, 1)">docs.docker.com
After</span>=network-<span style="color: rgba(0, 0, 0, 1)">online.target firewalld.service
Wants</span>=network-<span style="color: rgba(0, 0, 0, 1)">online.target
Type</span>=<span style="color: rgba(0, 0, 0, 1)">notify
EnvironmentFile</span>=/run/flannel/<span style="color: rgba(0, 0, 0, 1)">subnet.env
ExecStart</span>=/usr/bin/<span style="color: rgba(0, 0, 0, 1)">dockerd $DOCKER_NETWORK_OPTIONS
ExecReload</span>=/bin/kill -<span style="color: rgba(0, 0, 0, 1)">s HUP $MAINPID
LimitNOFILE</span>=<span style="color: rgba(0, 0, 0, 1)">infinity
LimitNPROC</span>=<span style="color: rgba(0, 0, 0, 1)">infinity
LimitCORE</span>=<span style="color: rgba(0, 0, 0, 1)">infinity
TimeoutStartSec</span>=<span style="color: rgba(0, 0, 0, 1)">0
Delegate</span>=<span style="color: rgba(0, 0, 0, 1)">yes
KillMode</span>=<span style="color: rgba(0, 0, 0, 1)">process
Restart</span>=on-<span style="color: rgba(0, 0, 0, 1)">failure
StartLimitBurst</span>=3<span style="color: rgba(0, 0, 0, 1)">
StartLimitInterval</span>=<span style="color: rgba(0, 0, 0, 1)">60s
WantedBy</span>=multi-user.target</pre>
</div>
<span class="cnblogs_code_collapse">vim /usr/lib/systemd/system/docker.service</span></div>
<p>8、启动flannel与docker、设置开机自启动</p>
<div class="cnblogs_code">
<pre>systemctl daemon-<span style="color: rgba(0, 0, 0, 1)">reload
systemctl enable flanneld
systemctl start flanneld
systemctl restart docker</span></pre>
</div>
<p>9、确认 docker 与 flannel 再同网段</p>
<div class="cnblogs_code"><img id="code_img_closed_dc70bd08-0eed-43b4-8b8c-78ca2a06145e" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_dc70bd08-0eed-43b4-8b8c-78ca2a06145e" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_dc70bd08-0eed-43b4-8b8c-78ca2a06145e" class="cnblogs_code_hide">
<pre>docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500<span style="color: rgba(0, 0, 0, 1)">
inet </span>172.17.26.1 netmask 255.255.255.0 broadcast 172.17.26.255<span style="color: rgba(0, 0, 0, 1)">
flannel.</span>1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1450<span style="color: rgba(0, 0, 0, 1)">
inet </span>172.17.26.0 netmask 255.255.255.255 broadcast 0.0.0.0</pre>
</div>
<span class="cnblogs_code_collapse">ifconfig</span></div>
<p>10、查看路由信息</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 1、查看生成的文件</span>
/opt/etcd/bin/etcdctl --ca-file=/opt/etcd/ssl/ca.pem --cert-file=/opt/etcd/ssl/server.pem --key-file=/opt/etcd/ssl/server-key.pem --endpoints=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">https://172.16.105.220:2379,https://172.16.105.230:2379,https://172.16.105.213:2379</span><span style="color: rgba(128, 0, 0, 1)">"</span> ls /coreos.com/network/subnets/</pre>
</div>
<div class="cnblogs_code"><img id="code_img_closed_5902f31c-d811-4c15-9e11-d9eec0551c0a" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_5902f31c-d811-4c15-9e11-d9eec0551c0a" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_5902f31c-d811-4c15-9e11-d9eec0551c0a" class="cnblogs_code_hide">
<pre>/coreos.com/network/subnets/172.17.59.0-24
/coreos.com/network/subnets/172.17.23.0-24
/coreos.com/network/subnets/172.17.26.0-24</pre>
</div>
<span class="cnblogs_code_collapse">输出:</span></div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 2、查看指定路由文件</span>
/opt/etcd/bin/etcdctl --ca-file=/opt/etcd/ssl/ca.pem --cert-file=/opt/etcd/ssl/server.pem --key-file=/opt/etcd/ssl/server-key.pem --endpoints=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">https://172.16.105.220:2379,https://172.16.105.230:2379,https://172.16.105.213:2379</span><span style="color: rgba(128, 0, 0, 1)">"</span> get /coreos.com/network/subnets/172.17.59.0-24</pre>
</div>
<div class="cnblogs_code"><img id="code_img_closed_c3684e8d-4ba5-4b07-88d9-7e4024f2d049" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_c3684e8d-4ba5-4b07-88d9-7e4024f2d049" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_c3684e8d-4ba5-4b07-88d9-7e4024f2d049" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 对应关系</span>
{<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">PublicIP</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">172.16.105.220</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">BackendType</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">vxlan</span><span style="color: rgba(128, 0, 0, 1)">"</span>,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">BackendData</span><span style="color: rgba(128, 0, 0, 1)">"</span>:{<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">VtepMAC</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ae:6b:20:4a:bd:ed</span><span style="color: rgba(128, 0, 0, 1)">"</span>}}</pre>
</div>
<span class="cnblogs_code_collapse">输出:</span></div>
<h2>3.6、部署 kubernetes 单Master集群</h2>
<p><img src="https://img2018.cnblogs.com/blog/1183448/201908/1183448-20190826141130751-831708556.png" alt=""></p>
<p> </p>
<ul>
<li>下载二进制包:https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG-1.12.md</li>
<li>下载这个包(kubernetes-server-linux-amd64.tar.gz)就够了,包含了所需的所有组件。</li>
</ul>
<p><strong><span style="font-size: 18px">1、生成证书</span></strong><br>1.1、执行命令生成证书使用的json文件1</p>
<div class="cnblogs_code"><img id="code_img_closed_17a771ea-fc1c-4ee6-9354-5d61dce39fd1" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_17a771ea-fc1c-4ee6-9354-5d61dce39fd1" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_17a771ea-fc1c-4ee6-9354-5d61dce39fd1" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">signing</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: {
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">default</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: {
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">expiry</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">87600h</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
},
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">profiles</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: {
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">kubernetes</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: {
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">expiry</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">87600h</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">usages</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: [
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">signing</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">key encipherment</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">server auth</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">client auth</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
]
}
}
}
}</span></pre>
</div>
<span class="cnblogs_code_collapse">vim ca-config.json</span></div>
<p>1.2、执行命令生成证书使用的json文件2</p>
<div class="cnblogs_code"><img id="code_img_closed_7480d040-701d-4123-9509-77da6f2ae007" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_7480d040-701d-4123-9509-77da6f2ae007" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_7480d040-701d-4123-9509-77da6f2ae007" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">CN</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">kubernetes</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">key</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: {
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">algo</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">rsa</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">size</span><span style="color: rgba(128, 0, 0, 1)">"</span>: 2048<span style="color: rgba(0, 0, 0, 1)">
},
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">names</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: [
{
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">C</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">CN</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">L</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Beijing</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ST</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">Beijing</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">O</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">k8s</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">OU</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">System</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
}
]
}</span></pre>
</div>
<span class="cnblogs_code_collapse">vim ca-csr.json</span></div>
<p>1.3、执行命令生成CA证书</p>
<div class="cnblogs_code">
<pre>cfssl gencert -initca ca-csr.json | cfssljson -bare ca -</pre>
</div>
<p>1.4、执行命令生成证书使用的json文件、注:添加所有使用到k8s的节点IP。</p>
<div class="cnblogs_code"><img id="code_img_closed_6db7340e-8203-4e9c-97fc-553973e63db5" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_6db7340e-8203-4e9c-97fc-553973e63db5" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_6db7340e-8203-4e9c-97fc-553973e63db5" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">CN</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">kubernetes</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">hosts</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: [
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">10.0.0.1</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">127.0.0.1</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">172.16.105.220</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">172.16.105.210</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">多选添加IP,Node节点不用添加</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">kubernetes</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">kubernetes.default</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">kubernetes.default.svc</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">kubernetes.default.svc.cluster</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">kubernetes.default.svc.cluster.local</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
],
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">key</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: {
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">algo</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">rsa</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">size</span><span style="color: rgba(128, 0, 0, 1)">"</span>: 2048<span style="color: rgba(0, 0, 0, 1)">
},
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">names</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: [
{
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">C</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">CN</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">L</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">BeiJing</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ST</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">BeiJing</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">O</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">k8s</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">OU</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">System</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
}
]
}</span></pre>
</div>
<span class="cnblogs_code_collapse">vim server-csr.json</span></div>
<p>1.5、执行命令生成 apiserver 证书</p>
<div class="cnblogs_code">
<pre>cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes server-csr.json | cfssljson -bare server</pre>
</div>
<p>1.6、执行命令生成证书使用的json文件生成 kube-proxy 证书</p>
<div class="cnblogs_code"><img id="code_img_closed_4e345e84-0211-4ccc-b19b-c8052089ea05" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_4e345e84-0211-4ccc-b19b-c8052089ea05" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_4e345e84-0211-4ccc-b19b-c8052089ea05" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">{
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">CN</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">system:kube-proxy</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">hosts</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: [],
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">key</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: {
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">algo</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">rsa</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">size</span><span style="color: rgba(128, 0, 0, 1)">"</span>: 2048<span style="color: rgba(0, 0, 0, 1)">
},
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">names</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">: [
{
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">C</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">CN</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">L</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">BeiJing</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">ST</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">BeiJing</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">O</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">k8s</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">,
</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">OU</span><span style="color: rgba(128, 0, 0, 1)">"</span>: <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">System</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
}
]
}</span></pre>
</div>
<span class="cnblogs_code_collapse">vim kube-proxy-csr.json</span></div>
<p>1.7、执行命令生成 kube-proxy 证书</p>
<div class="cnblogs_code">
<pre>cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy</pre>
</div>
<p>1.8、查看所有生成证书</p>
<div class="cnblogs_code"><img id="code_img_closed_aab37bf2-4648-4df7-a0f6-03da42c630da" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_aab37bf2-4648-4df7-a0f6-03da42c630da" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_aab37bf2-4648-4df7-a0f6-03da42c630da" class="cnblogs_code_hide">
<pre>ca-key.pemca.pemkube-proxy-key.pemkube-proxy.pemserver-key.pemserver.pem</pre>
</div>
<span class="cnblogs_code_collapse"> ls *pem</span></div>
<h3><span style="font-size: 18px">2、部署Master apiserver 组件</span></h3>
<p>1、下载到k8s目录解压、进入目录</p>
<div class="cnblogs_code">
<pre>tar -xzvf kubernetes-server-linux-<span style="color: rgba(0, 0, 0, 1)">amd64.tar.gz
cd kubernetes</span>/server/bin/</pre>
</div>
<p>2、创建目录</p>
<div class="cnblogs_code">
<pre>mkdir /opt/kubernetes/{bin,cfg,ssl,logs} -p</pre>
</div>
<p>3、将二进制文件导入到相应目录下</p>
<div class="cnblogs_code">
<pre>cp kube-apiserver kube-scheduler kube-controller-manager kubectl /opt/kubernetes/bin</pre>
</div>
<p>4、将生成的证书文件存入到指定文件</p>
<div class="cnblogs_code">
<pre>cp ca.pem ca-key.pem server.pem server-key.pem /opt/kubernetes/ssl/</pre>
</div>
<p>5、创建 token 文件</p>
<div class="cnblogs_code"><img id="code_img_closed_77629aa6-4a3d-42a7-ae33-7ff1f2ddf8fb" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_77629aa6-4a3d-42a7-ae33-7ff1f2ddf8fb" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_77629aa6-4a3d-42a7-ae33-7ff1f2ddf8fb" class="cnblogs_code_hide">
<pre>674c457d4dcf2eefe4920d7dbb6b0ddc,kubelet-bootstrap,10001,<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">system:kubelet-bootstrap</span><span style="color: rgba(128, 0, 0, 1)">"</span></pre>
</div>
<span class="cnblogs_code_collapse">vim /opt/kubernetes/cfg/token.csv</span></div>
<div class="cnblogs_code"><img id="code_img_closed_148be488-9090-48e3-b946-42679cba38f4" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_148be488-9090-48e3-b946-42679cba38f4" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_148be488-9090-48e3-b946-42679cba38f4" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">第一列:随机字符串,自己可生成
第二列:用户名
第三列:UID
第四列:用户组</span></pre>
</div>
<span class="cnblogs_code_collapse">说明</span></div>
<p>6、创建 apiserver 配置文件、确保配置好生成证书,确保连接etcd</p>
<div class="cnblogs_code"><img id="code_img_closed_3178deec-5af3-417e-babc-cb297f3fbf7f" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_3178deec-5af3-417e-babc-cb297f3fbf7f" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_3178deec-5af3-417e-babc-cb297f3fbf7f" class="cnblogs_code_hide">
<pre>KUBE_APISERVER_OPTS=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">--logtostderr=false \
--log-dir=/opt/kubernetes/logs \
--v=4 \
--etcd-servers=https://172.16.105.220:2379,https://172.16.105.230:2379,https://172.16.105.213:2379 \
--bind-address=172.16.105.220 \
--secure-port=6443 \
--advertise-address=172.16.105.220 \
--allow-privileged=true \
--service-cluster-ip-range=10.0.0.0/24 \
--service-node-port-range=30000-50000 \
--enable-admission-plugins=NamespaceLifecycle,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota,NodeRestriction \
--authorization-mode=RBAC,Node \
--enable-bootstrap-token-auth \
--token-auth-file=/opt/kubernetes/cfg/token.csv \
--tls-cert-file=/opt/kubernetes/ssl/server.pem\
--tls-private-key-file=/opt/kubernetes/ssl/server-key.pem \
--client-ca-file=/opt/kubernetes/ssl/ca.pem \
--service-account-key-file=/opt/kubernetes/ssl/ca-key.pem \
--etcd-cafile=/opt/etcd/ssl/ca.pem \
--etcd-certfile=/opt/etcd/ssl/server.pem \
--etcd-keyfile=/opt/etcd/ssl/server-key.pem</span><span style="color: rgba(128, 0, 0, 1)">"</span></pre>
</div>
<span class="cnblogs_code_collapse">vim /opt/kubernetes/cfg/kube-apiserver</span></div>
<div class="cnblogs_code"><img id="code_img_closed_9a7a994b-140e-4d6c-952b-16d29bb17c88" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_9a7a994b-140e-4d6c-952b-16d29bb17c88" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_9a7a994b-140e-4d6c-952b-16d29bb17c88" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">参数说明:
· </span>--<span style="color: rgba(0, 0, 0, 1)">logtostderr 启用日志
· </span>---<span style="color: rgba(0, 0, 0, 1)">v 日志等级
· </span>--etcd-<span style="color: rgba(0, 0, 0, 1)">servers etcd集群地址
· </span>--bind-<span style="color: rgba(0, 0, 0, 1)">address 监听地址
· </span>--secure-<span style="color: rgba(0, 0, 0, 1)">port https安全端口
· </span>--advertise-<span style="color: rgba(0, 0, 0, 1)">address 集群通告地址
· </span>--allow-<span style="color: rgba(0, 0, 0, 1)">privileged 启用授权
· </span>--service-cluster-ip-<span style="color: rgba(0, 0, 0, 1)">range Service虚拟IP地址段
· </span>--enable-admission-<span style="color: rgba(0, 0, 0, 1)">plugins 准入控制模块
· </span>--authorization-<span style="color: rgba(0, 0, 0, 1)">mode 认证授权,启用RBAC授权和节点自管理
· </span>--enable-bootstrap-token-<span style="color: rgba(0, 0, 0, 1)">auth 启用TLS bootstrap功能,后面会讲到
· </span>--token-auth-<span style="color: rgba(0, 0, 0, 1)">file token文件
· </span>--service-node-port-<span style="color: rgba(0, 0, 0, 1)">range Service Node类型默认分配端口范围
日志:
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> true 日志默认放到/var/log/messages</span>
--logtostderr=<span style="color: rgba(0, 0, 0, 1)">true
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> false 日志可以指定放到一个目录</span>
--logtostderr=<span style="color: rgba(0, 0, 0, 1)">false
</span>--log-dir=/opt/kubernetes/logs</pre>
</div>
<span class="cnblogs_code_collapse">参数说明:</span></div>
<p>7、创建 systemd 管理 apiserver</p>
<div class="cnblogs_code"><img id="code_img_closed_ca87b1c8-49a8-4f75-be70-17d76068acf6" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_ca87b1c8-49a8-4f75-be70-17d76068acf6" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_ca87b1c8-49a8-4f75-be70-17d76068acf6" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">
Description</span>=<span style="color: rgba(0, 0, 0, 1)">Kubernetes API Server
Documentation</span>=https://github.com/kubernetes/<span style="color: rgba(0, 0, 0, 1)">kubernetes
EnvironmentFile</span>=-/opt/kubernetes/cfg/kube-<span style="color: rgba(0, 0, 0, 1)">apiserver
ExecStart</span>=/opt/kubernetes/bin/kube-<span style="color: rgba(0, 0, 0, 1)">apiserver $KUBE_APISERVER_OPTS
Restart</span>=on-<span style="color: rgba(0, 0, 0, 1)">failure
WantedBy</span>=multi-user.target</pre>
</div>
<span class="cnblogs_code_collapse">vim /usr/lib/systemd/system/kube-apiserver.service</span></div>
<p>8、启动、并设置开机自启动</p>
<div class="cnblogs_code">
<pre>systemctl daemon-<span style="color: rgba(0, 0, 0, 1)">reload
systemctl enable kube</span>-<span style="color: rgba(0, 0, 0, 1)">apiserver
systemctl restart kube</span>-apiserver</pre>
</div>
<p>9、查看端口</p>
<div class="cnblogs_code"><img id="code_img_closed_cc7767ed-3bc5-45c0-9b26-963176993d15" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_cc7767ed-3bc5-45c0-9b26-963176993d15" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_cc7767ed-3bc5-45c0-9b26-963176993d15" class="cnblogs_code_hide">
<pre>tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 5431/kube-apiserver </pre>
</div>
<span class="cnblogs_code_collapse">netstat -lnpt | grep 8080</span></div>
<div class="cnblogs_code"><img id="code_img_closed_85b15e2c-1ea4-40ed-b5fc-26a564bf5b75" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_85b15e2c-1ea4-40ed-b5fc-26a564bf5b75" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_85b15e2c-1ea4-40ed-b5fc-26a564bf5b75" class="cnblogs_code_hide">
<pre>tcp 0 0 172.16.105.220:6443 0.0.0.0:* LISTEN 5431/kube-apiserver </pre>
</div>
<span class="cnblogs_code_collapse">netstat -lnpt | grep 6443</span></div>
<p><strong><span style="font-size: 18px">3、部署 Master scheduler 组件</span></strong><br>1、创建 schduler 配置文件</p>
<div class="cnblogs_code"><img id="code_img_closed_d3279e33-76b2-416f-a3ef-6d19c6db32eb" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_d3279e33-76b2-416f-a3ef-6d19c6db32eb" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_d3279e33-76b2-416f-a3ef-6d19c6db32eb" class="cnblogs_code_hide">
<pre>KUBE_SCHEDULER_OPTS=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">--logtostderr=true \
--v=4 \
--master=127.0.0.1:8080 \
--leader-elect</span><span style="color: rgba(128, 0, 0, 1)">"</span></pre>
</div>
<span class="cnblogs_code_collapse">vim /opt/kubernetes/cfg/kube-scheduler</span></div>
<div class="cnblogs_code"><img id="code_img_closed_3ebcb5d0-7e4f-4f72-bd1f-4a62cc1c606f" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_3ebcb5d0-7e4f-4f72-bd1f-4a62cc1c606f" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_3ebcb5d0-7e4f-4f72-bd1f-4a62cc1c606f" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">参数说明:
· </span>--<span style="color: rgba(0, 0, 0, 1)">master 连接本地apiserver
· </span>--leader-elect 当该组件启动多个时,自动选举(HA)</pre>
</div>
<span class="cnblogs_code_collapse">参数说明:</span></div>
<p>2、systemd管理schduler组件</p>
<div class="cnblogs_code"><img id="code_img_closed_d7401393-c39a-4af2-8137-15ae6835afb9" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_d7401393-c39a-4af2-8137-15ae6835afb9" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_d7401393-c39a-4af2-8137-15ae6835afb9" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">
Description</span>=<span style="color: rgba(0, 0, 0, 1)">Kubernetes Scheduler
Documentation</span>=https://github.com/kubernetes/<span style="color: rgba(0, 0, 0, 1)">kubernetes
EnvironmentFile</span>=-/opt/kubernetes/cfg/kube-<span style="color: rgba(0, 0, 0, 1)">scheduler
ExecStart</span>=/opt/kubernetes/bin/kube-<span style="color: rgba(0, 0, 0, 1)">scheduler $KUBE_SCHEDULER_OPTS
Restart</span>=on-<span style="color: rgba(0, 0, 0, 1)">failure
WantedBy</span>=multi-user.target</pre>
</div>
<span class="cnblogs_code_collapse">vim /usr/lib/systemd/system/kube-scheduler.service</span></div>
<p>3、启动并设置开机自启</p>
<div class="cnblogs_code">
<pre>systemctl daemon-<span style="color: rgba(0, 0, 0, 1)">reload
systemctl enable kube</span>-<span style="color: rgba(0, 0, 0, 1)">scheduler
systemctl restart kube</span>-scheduler</pre>
</div>
<p>4、查看进程</p>
<div class="cnblogs_code"><img id="code_img_closed_19e625b3-409e-4bfb-8250-190efdd9a041" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_19e625b3-409e-4bfb-8250-190efdd9a041" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_19e625b3-409e-4bfb-8250-190efdd9a041" class="cnblogs_code_hide">
<pre>root 8393 0.5 1.1 45360 21356 ? Ssl 11:23 0:00 /opt/kubernetes/bin/kube-scheduler --logtostderr=true --v=4 --master=127.0.0.1:8080 --leader-elect</pre>
</div>
<span class="cnblogs_code_collapse">ps -aux | grep kube-scheduler</span></div>
<p><strong><span style="font-size: 18px">4、部署 </span></strong><strong><span style="font-size: 18px">Master </span></strong><strong><span style="font-size: 18px">controller-manager 组件</span></strong><br>1、创建 controller-manager 配置文件</p>
<div class="cnblogs_code"><img id="code_img_closed_00a63fde-aa46-4305-82c0-a206fb3ad8ba" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_00a63fde-aa46-4305-82c0-a206fb3ad8ba" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_00a63fde-aa46-4305-82c0-a206fb3ad8ba" class="cnblogs_code_hide">
<pre>KUBE_CONTROLLER_MANAGER_OPTS=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">--logtostderr=true \
--v=4 \
--master=127.0.0.1:8080 \
--leader-elect=true \
--address=127.0.0.1 \
--service-cluster-ip-range=10.0.0.0/24 \
--cluster-name=kubernetes \
--cluster-signing-cert-file=/opt/kubernetes/ssl/ca.pem \
--cluster-signing-key-file=/opt/kubernetes/ssl/ca-key.pem\
--root-ca-file=/opt/kubernetes/ssl/ca.pem \
--service-account-private-key-file=/opt/kubernetes/ssl/ca-key.pem \
--experimental-cluster-signing-duration=87600h0m0s</span><span style="color: rgba(128, 0, 0, 1)">"</span></pre>
</div>
<span class="cnblogs_code_collapse">vim /opt/kubernetes/cfg/kube-controller-manager</span></div>
<p>2、systemd管理controller-manager组件</p>
<div class="cnblogs_code"><img id="code_img_closed_ac59d030-7fc0-4183-b36c-2a62c2da537f" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_ac59d030-7fc0-4183-b36c-2a62c2da537f" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_ac59d030-7fc0-4183-b36c-2a62c2da537f" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">
Description</span>=<span style="color: rgba(0, 0, 0, 1)">Kubernetes Controller Manager
Documentation</span>=https://github.com/kubernetes/<span style="color: rgba(0, 0, 0, 1)">kubernetes
EnvironmentFile</span>=-/opt/kubernetes/cfg/kube-controller-<span style="color: rgba(0, 0, 0, 1)">manager
ExecStart</span>=/opt/kubernetes/bin/kube-controller-<span style="color: rgba(0, 0, 0, 1)">manager $KUBE_CONTROLLER_MANAGER_OPTS
Restart</span>=on-<span style="color: rgba(0, 0, 0, 1)">failure
WantedBy</span>=multi-user.target</pre>
</div>
<span class="cnblogs_code_collapse">vim /usr/lib/systemd/system/kube-controller-manager.service</span></div>
<p>3、启动并添加开机自启</p>
<div class="cnblogs_code">
<pre>systemctl daemon-<span style="color: rgba(0, 0, 0, 1)">reload
systemctl enable kube</span>-controller-<span style="color: rgba(0, 0, 0, 1)">manager
systemctl restart kube</span>-controller-manager</pre>
</div>
<p>4、查看进程</p>
<div class="cnblogs_code"><img id="code_img_closed_3e4e26c5-2810-4d9f-88e7-41ed7cda3e09" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_3e4e26c5-2810-4d9f-88e7-41ed7cda3e09" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_3e4e26c5-2810-4d9f-88e7-41ed7cda3e09" class="cnblogs_code_hide">
<pre>root 8966 0.4 1.1 45360 20900 ? Ssl 11:27 0:00 /opt/kubernetes/bin/kube-scheduler --logtostderr=true --v=4 --master=127.0.0.1:8080 --leader-elect</pre>
</div>
<span class="cnblogs_code_collapse">ps -aux | grep controller-manager</span></div>
<p>5、通过 kubectl 检查所有组件状态</p>
<div class="cnblogs_code"><img id="code_img_closed_6995bc7a-f8dd-42aa-ae6e-87df95db3e15" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_6995bc7a-f8dd-42aa-ae6e-87df95db3e15" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_6995bc7a-f8dd-42aa-ae6e-87df95db3e15" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">NAME STATUS MESSAGE ERROR
controller</span>-<span style="color: rgba(0, 0, 0, 1)">manager Healthy ok
scheduler Healthy ok
etcd</span>-2 Healthy {<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">health</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">true</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">}
etcd</span>-0 Healthy {<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">health</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">true</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">}
etcd</span>-1 Healthy {<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">health</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">true</span><span style="color: rgba(128, 0, 0, 1)">"</span>}</pre>
</div>
<span class="cnblogs_code_collapse">/opt/kubernetes/bin/kubectl get cs</span></div>
<h3><strong><span style="font-size: 18px">5、部署 kubecongig 文件</span></strong></h3>
<p><strong>master 节点配置</strong></p>
<p>1、将kubelet-bootstrap用户绑定到系统集群角色。生成的token文件中定义的角色。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 主要为kuelet办法证书的最小全权限</span>
/opt/kubernetes/bin/kubectl create clusterrolebinding kubelet-<span style="color: rgba(0, 0, 0, 1)">bootstrap \
</span>--clusterrole=system:node-<span style="color: rgba(0, 0, 0, 1)">bootstrapper \
</span>--user=kubelet-bootstrap</pre>
</div>
<p>2、创建kubeconfig文件、在生成kubernetes证书的目录下执行以下命令生成kubeconfig文件:</p>
<div class="cnblogs_code"><img id="code_img_closed_f4afe1b6-9f13-4abf-a563-477717aabb5e" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_f4afe1b6-9f13-4abf-a563-477717aabb5e" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_f4afe1b6-9f13-4abf-a563-477717aabb5e" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 创建kubelet bootstrapping kubeconfig </span>
BOOTSTRAP_TOKEN=<span style="color: rgba(0, 0, 0, 1)">674c457d4dcf2eefe4920d7dbb6b0ddc
KUBE_APISERVER</span>=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">https://172.16.105.220:6443</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 设置集群参数</span>
kubectl config set-<span style="color: rgba(0, 0, 0, 1)">cluster kubernetes \
</span>--certificate-authority=/root/k8s/k8s-cert/<span style="color: rgba(0, 0, 0, 1)">ca.pem \
</span>--embed-certs=<span style="color: rgba(0, 0, 0, 1)">true \
</span>--server=<span style="color: rgba(0, 0, 0, 1)">${KUBE_APISERVER} \
</span>--kubeconfig=<span style="color: rgba(0, 0, 0, 1)">bootstrap.kubeconfig
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 设置客户端认证参数</span>
kubectl config set-credentials kubelet-<span style="color: rgba(0, 0, 0, 1)">bootstrap \
</span>--token=<span style="color: rgba(0, 0, 0, 1)">${BOOTSTRAP_TOKEN} \
</span>--kubeconfig=<span style="color: rgba(0, 0, 0, 1)">bootstrap.kubeconfig
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 设置上下文参数</span>
kubectl config set-<span style="color: rgba(0, 0, 0, 1)">context default \
</span>--cluster=<span style="color: rgba(0, 0, 0, 1)">kubernetes \
</span>--user=kubelet-<span style="color: rgba(0, 0, 0, 1)">bootstrap \
</span>--kubeconfig=<span style="color: rgba(0, 0, 0, 1)">bootstrap.kubeconfig
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 设置默认上下文</span>
kubectl config use-context default --kubeconfig=<span style="color: rgba(0, 0, 0, 1)">bootstrap.kubeconfig
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)">----------------------</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 创建kube-proxy kubeconfig文件</span>
<span style="color: rgba(0, 0, 0, 1)">
kubectl config set</span>-<span style="color: rgba(0, 0, 0, 1)">cluster kubernetes \
</span>--certificate-authority=/root/k8s/k8s-cert/<span style="color: rgba(0, 0, 0, 1)">ca.pem \
</span>--embed-certs=<span style="color: rgba(0, 0, 0, 1)">true \
</span>--server=<span style="color: rgba(0, 0, 0, 1)">${KUBE_APISERVER} \
</span>--kubeconfig=kube-<span style="color: rgba(0, 0, 0, 1)">proxy.kubeconfig
kubectl config set</span>-credentials kube-<span style="color: rgba(0, 0, 0, 1)">proxy \
</span>--client-certificate=/root/k8s/k8s-cert/kube-<span style="color: rgba(0, 0, 0, 1)">proxy.pem \
</span>--client-key=/root/k8s/k8s-cert/kube-proxy-<span style="color: rgba(0, 0, 0, 1)">key.pem \
</span>--embed-certs=<span style="color: rgba(0, 0, 0, 1)">true \
</span>--kubeconfig=kube-<span style="color: rgba(0, 0, 0, 1)">proxy.kubeconfig
kubectl config set</span>-<span style="color: rgba(0, 0, 0, 1)">context default \
</span>--cluster=<span style="color: rgba(0, 0, 0, 1)">kubernetes \
</span>--user=kube-<span style="color: rgba(0, 0, 0, 1)">proxy \
</span>--kubeconfig=kube-<span style="color: rgba(0, 0, 0, 1)">proxy.kubeconfig
kubectl config use</span>-context default --kubeconfig=kube-proxy.kubeconfig</pre>
</div>
<span class="cnblogs_code_collapse">vim kubeconfig.sh</span></div>
<p>3、执行脚本</p>
<div class="cnblogs_code">
<pre>bash kubeconfig.sh</pre>
</div>
<p>4、将生成的kube-proxy.kubeconfig与bootstrap.kubeconfig copy 到 Node 机器内。</p>
<div class="cnblogs_code">
<pre>scp bootstrap.kubeconfig kube-proxy.kubeconfig root@172.16.105.230:/opt/kubernetes/cfg/<span style="color: rgba(0, 0, 0, 1)">
scp bootstrap.kubeconfig kube</span>-proxy.kubeconfig root@172.16.105.213:/opt/kubernetes/cfg/</pre>
</div>
<h3>6、部署Node kubelet 组件</h3>
<p>1、Node节点创建目录</p>
<div class="cnblogs_code">
<pre>mkdir -p /opt/kubernetes/{cfg,bin,logs,ssl}</pre>
</div>
<p>2、copy下列文件到指定目录下</p>
<ul>
<li>使用:/kubernetes/server/bin/kubelet</li>
<li>使用:/kubernetes/server/bin/kube-proxy</li>
<li>将上面两个文件copy到Node端/opt/kubernetes/bin/目录下</li>
</ul>
<p>3、创建 kubelet 配置文件</p>
<div class="cnblogs_code"><img id="code_img_closed_5746f300-8e13-4ecb-9db4-f9969586ccab" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_5746f300-8e13-4ecb-9db4-f9969586ccab" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_5746f300-8e13-4ecb-9db4-f9969586ccab" class="cnblogs_code_hide">
<pre>KUBELET_OPTS=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">--logtostderr=false \
--log-dir=/opt/kubernetes/logs/ \
--v=4 \
--hostname-override=172.16.105.213 \
--kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig \
--bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig \
--config=/opt/kubernetes/cfg/kubelet.config \
--cert-dir=/opt/kubernetes/ssl \
--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0</span><span style="color: rgba(128, 0, 0, 1)">"</span></pre>
</div>
<span class="cnblogs_code_collapse">vim /opt/kubernetes/cfg/kubelet</span></div>
<div class="cnblogs_code"><img id="code_img_closed_ec97223f-2485-416d-b01d-338d83e0934b" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_ec97223f-2485-416d-b01d-338d83e0934b" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_ec97223f-2485-416d-b01d-338d83e0934b" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">参数说明:
· </span>--hostname-<span style="color: rgba(0, 0, 0, 1)">override 在集群中显示的主机名
· </span>--<span style="color: rgba(0, 0, 0, 1)">kubeconfig 指定kubeconfig文件位置,会自动生成
· </span>--bootstrap-<span style="color: rgba(0, 0, 0, 1)">kubeconfig 指定刚才生成的bootstrap.kubeconfig文件
· </span>--cert-<span style="color: rgba(0, 0, 0, 1)">dir 颁发证书存放位置
· </span>--pod-infra-container-image 管理Pod网络的镜像</pre>
</div>
<span class="cnblogs_code_collapse">参数说明:</span></div>
<p>2、创建 kubelet.config 配置文件</p>
<div class="cnblogs_code"><img id="code_img_closed_20e41d22-54ec-47a6-b9ad-2e97132d2a95" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_20e41d22-54ec-47a6-b9ad-2e97132d2a95" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_20e41d22-54ec-47a6-b9ad-2e97132d2a95" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">kind: KubeletConfiguration
apiVersion: kubelet.config.k8s.io</span>/<span style="color: rgba(0, 0, 0, 1)">v1beta1
address: </span>172.16.105.213<span style="color: rgba(0, 0, 0, 1)">
port: </span>10250<span style="color: rgba(0, 0, 0, 1)">
readOnlyPort: </span>10255<span style="color: rgba(0, 0, 0, 1)">
cgroupDriver: cgroupfs
clusterDNS: [</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">10.0.0.2</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">]
clusterDomain: cluster.local.
failSwapOn: false
authentication:
anonymous:
enabled: true</span></pre>
</div>
<span class="cnblogs_code_collapse">vim /opt/kubernetes/cfg/kubelet.config</span></div>
<p>3、systemd 管理 kubelet 组件</p>
<div class="cnblogs_code"><img id="code_img_closed_a9c4ca01-ea8e-4037-a767-65a30b00a256" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_a9c4ca01-ea8e-4037-a767-65a30b00a256" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_a9c4ca01-ea8e-4037-a767-65a30b00a256" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">
Description</span>=<span style="color: rgba(0, 0, 0, 1)">Kubernetes Kubelet
After</span>=<span style="color: rgba(0, 0, 0, 1)">docker.service
Requires</span>=<span style="color: rgba(0, 0, 0, 1)">docker.service
EnvironmentFile</span>=/opt/kubernetes/cfg/<span style="color: rgba(0, 0, 0, 1)">kubelet
ExecStart</span>=/opt/kubernetes/bin/<span style="color: rgba(0, 0, 0, 1)">kubelet $KUBELET_OPTS
Restart</span>=on-<span style="color: rgba(0, 0, 0, 1)">failure
KillMode</span>=<span style="color: rgba(0, 0, 0, 1)">process
WantedBy</span>=multi-user.target</pre>
</div>
<span class="cnblogs_code_collapse">vim /usr/lib/systemd/system/kubelet.service</span></div>
<p>4、启动并设置开机自启动</p>
<div class="cnblogs_code">
<pre>systemctl daemon-<span style="color: rgba(0, 0, 0, 1)">reload
systemctl enable kubelet.service
systemctl start kubelet.service</span></pre>
</div>
<p>5、查看进程</p>
<div class="cnblogs_code"><img id="code_img_closed_745ef0d6-b5c7-4654-8943-2d6ec3d1e7f4" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_745ef0d6-b5c7-4654-8943-2d6ec3d1e7f4" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_745ef0d6-b5c7-4654-8943-2d6ec3d1e7f4" class="cnblogs_code_hide">
<pre>root 246070.81.7 626848 69140 ? Ssl16:03 0:05 /opt/kubernetes/bin/kubelet --logtostderr=false --log-dir=/opt/kubernetes/logs/ --v=4 --hostname-override=172.16.105.213 --kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig --bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig --config=/opt/kubernetes/cfg/kubelet.config --cert-dir=/opt/kubernetes/ssl --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0</pre>
</div>
<span class="cnblogs_code_collapse">ps -aux | grep kubelet</span></div>
<p>6、Master 端 审批Node 加入集群:</p>
<ul>
<li>启动后还没加入到集群中,需要手动允许该节点才可以。</li>
<li>在Master节点查看请求签名的Node:</li>
</ul>
<p>7、查看请求加入集群的Node</p>
<div class="cnblogs_code"><img id="code_img_closed_7b763052-b50d-40f0-a801-85c9ebcc3a7e" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_7b763052-b50d-40f0-a801-85c9ebcc3a7e" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_7b763052-b50d-40f0-a801-85c9ebcc3a7e" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">NAME AGE REQUESTOR CONDITION
node</span>-csr-7ZHhg19mVh1w2gfJOh55eaBsRisA_wT8EHZQfqCLPLE 21s kubelet-<span style="color: rgba(0, 0, 0, 1)">bootstrap Pending
node</span>-csr-weeFsR6VVUNIHyohOgaGvy2Hr6M9qSUIkoGjQ_mUyOo 28s kubelet-bootstrap Pending</pre>
</div>
<span class="cnblogs_code_collapse">kubectl get csr</span></div>
<p>8、同意请求让Node节点加入</p>
<div class="cnblogs_code">
<pre>kubectl certificate approve node-csr-<span style="color: rgba(0, 0, 0, 1)">7ZHhg19mVh1w2gfJOh55eaBsRisA_wT8EHZQfqCLPLE
kubectl certificate approve node</span>-csr-weeFsR6VVUNIHyohOgaGvy2Hr6M9qSUIkoGjQ_mUyOo</pre>
</div>
<p>9、查看加入节点</p>
<div class="cnblogs_code"><img id="code_img_closed_c4767766-611d-4177-a323-f1878518f6a3" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_c4767766-611d-4177-a323-f1878518f6a3" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_c4767766-611d-4177-a323-f1878518f6a3" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">NAME STATUS ROLES AGE VERSION
</span>172.16.105.213 Ready <none> 42s v1.12.1
172.16.105.230 Ready <none> 57s v1.12.1</pre>
</div>
<span class="cnblogs_code_collapse">kubectl get node</span></div>
<h3>7、部署Node kube-proxy组件</h3>
<p>1、创建 kube-proxy 配置文件</p>
<div class="cnblogs_code"><img id="code_img_closed_a0382842-9fa9-45f5-b4b5-3f0288ef0d41" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_a0382842-9fa9-45f5-b4b5-3f0288ef0d41" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_a0382842-9fa9-45f5-b4b5-3f0288ef0d41" class="cnblogs_code_hide">
<pre>KUBE_PROXY_OPTS=<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">--logtostderr=true \
--v=4 \
--hostname-override=172.16.105.213 \
--cluster-cidr=10.0.0.0/24 \
--kubeconfig=/opt/kubernetes/cfg/kube-proxy.kubeconfig</span><span style="color: rgba(128, 0, 0, 1)">"</span></pre>
</div>
<span class="cnblogs_code_collapse">vim /opt/kubernetes/cfg/kube-proxy</span></div>
<p>2、systemd管理kube-proxy组件</p>
<div class="cnblogs_code"><img id="code_img_closed_5cb2560b-029f-452d-a690-932e522a7592" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_5cb2560b-029f-452d-a690-932e522a7592" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_5cb2560b-029f-452d-a690-932e522a7592" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">
Description</span>=<span style="color: rgba(0, 0, 0, 1)">Kubernetes Proxy
After</span>=<span style="color: rgba(0, 0, 0, 1)">network.target
EnvironmentFile</span>=-/opt/kubernetes/cfg/kube-<span style="color: rgba(0, 0, 0, 1)">proxy
ExecStart</span>=/opt/kubernetes/bin/kube-<span style="color: rgba(0, 0, 0, 1)">proxy $KUBE_PROXY_OPTS
Restart</span>=on-<span style="color: rgba(0, 0, 0, 1)">failure
WantedBy</span>=multi-user.target</pre>
</div>
<span class="cnblogs_code_collapse">vim /usr/lib/systemd/system/kube-proxy.service</span></div>
<p>3、启动并设置开机自启动</p>
<div class="cnblogs_code">
<pre>systemctl daemon-<span style="color: rgba(0, 0, 0, 1)">reload
systemctl enable kube</span>-<span style="color: rgba(0, 0, 0, 1)">proxy
systemctl start kube</span>-proxy</pre>
</div>
<p>4、查看进程</p>
<div class="cnblogs_code"><img id="code_img_closed_aebb19a2-12ff-4f3e-bcc8-c22be2b5bda7" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_aebb19a2-12ff-4f3e-bcc8-c22be2b5bda7" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_aebb19a2-12ff-4f3e-bcc8-c22be2b5bda7" class="cnblogs_code_hide">
<pre>root 271660.30.541588 21332 ? Ssl16:16 0:00 /opt/kubernetes/bin/kube-proxy --logtostderr=true --v=4 --hostname-override=172.16.105.213 --cluster-cidr=10.0.0.0/24 --kubeconfig=/opt/kubernetes/cfg/kube-proxy.kubeconfig</pre>
</div>
<span class="cnblogs_code_collapse">ps -aux | grep kube-proxy</span></div>
<h3>8、其他设置</h3>
<p>1、解决:将匿名用户绑定到系统用户</p>
<div class="cnblogs_code">
<pre>kubectl create clusterrolebinding system:anonymous --clusterrole=cluster-admin --user=system:anonymous</pre>
</div>
<h2> 3.7、部署 kubernetes 多Master集群</h2>
<p><img src="https://img2018.cnblogs.com/blog/1183448/201908/1183448-20190826141327930-2131307766.png" alt="" width="965" height="325"></p>
<h3>1、Master2配置部署</h3>
<ul>
<li>注:Master节点2配置与单Master相同下面我这里只直接略过相同配置。</li>
<li>注:直接复制配置文件可能会导致etcd链接问题</li>
<li>注:最好以master为etcd端。</li>
</ul>
<p>1、修改Master02配置文件中的IP,更改为Master02IP</p>
<div class="cnblogs_code"><img id="code_img_closed_58a0d5cd-f24e-42d0-8811-fb5940508b13" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_58a0d5cd-f24e-42d0-8811-fb5940508b13" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_58a0d5cd-f24e-42d0-8811-fb5940508b13" class="cnblogs_code_hide">
<pre>--bind-address=172.16.105.212
--advertise-address=172.16.105.212</pre>
</div>
<span class="cnblogs_code_collapse">vim kube-apiserver</span></div>
<p>2、启动Master02 k8s</p>
<div class="cnblogs_code">
<pre>systemctl start kube-<span style="color: rgba(0, 0, 0, 1)">apiserver
systemctl start kube</span>-<span style="color: rgba(0, 0, 0, 1)">scheduler
systemctl start kube</span>-controller-manager</pre>
</div>
<p>3、查看集群状态</p>
<div class="cnblogs_code"><img id="code_img_closed_c3867393-fcce-4c78-9f7c-48a4da2a7586" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_c3867393-fcce-4c78-9f7c-48a4da2a7586" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_c3867393-fcce-4c78-9f7c-48a4da2a7586" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">NAME STATUS MESSAGE ERROR
etcd</span>-1 Healthy {<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">health</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">true</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">}
etcd</span>-2 Healthy {<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">health</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">true</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">}
controller</span>-<span style="color: rgba(0, 0, 0, 1)">manager Healthy ok
scheduler Healthy ok
etcd</span>-0 Healthy {<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">health</span><span style="color: rgba(128, 0, 0, 1)">"</span>:<span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">true</span><span style="color: rgba(128, 0, 0, 1)">"</span>} </pre>
</div>
<span class="cnblogs_code_collapse">kubectl get cs</span></div>
<p>5、查看etcd连接状态</p>
<div class="cnblogs_code"><img id="code_img_closed_33cee399-0bf9-4cfc-ba51-4fa82d6b0fa6" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_33cee399-0bf9-4cfc-ba51-4fa82d6b0fa6" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_33cee399-0bf9-4cfc-ba51-4fa82d6b0fa6" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">NAME STATUS ROLES AGE VERSION
</span>172.16.105.213 Ready <none> 41h v1.12.1
172.16.105.230 Ready <none> 41h v1.12.1</pre>
</div>
<span class="cnblogs_code_collapse">kubectl get node</span></div>
<p><strong><span style="font-size: 18px">2、部署 Nginx 负载均衡</span></strong></p>
<ul>
<li>注:保证系统时间统一证书正常使用</li>
<li>nginx官网:http://www.nginx.org</li>
<li>documentation --> Installing nginx --> packages</li>
</ul>
<p>1、复制nginx官方源写入到/etc/yum.repos.d/nginx.repo、修该centos版本</p>
<div class="cnblogs_code"><img id="code_img_closed_fdf3b9d1-ad3e-4414-ba46-81de364ad8fd" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_fdf3b9d1-ad3e-4414-ba46-81de364ad8fd" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_fdf3b9d1-ad3e-4414-ba46-81de364ad8fd" class="cnblogs_code_hide">
<pre>
name</span>=<span style="color: rgba(0, 0, 0, 1)">nginx stable repo
baseurl</span>=http://nginx.org/packages/centos/7/$basearch/<span style="color: rgba(0, 0, 0, 1)">
gpgcheck</span>=1<span style="color: rgba(0, 0, 0, 1)">
enabled</span>=1<span style="color: rgba(0, 0, 0, 1)">
gpgkey</span>=https://nginx.org/keys/<span style="color: rgba(0, 0, 0, 1)">nginx_signing.key
name</span>=<span style="color: rgba(0, 0, 0, 1)">nginx mainline repo
baseurl</span>=http://nginx.org/packages/mainline/centos/7/$basearch/<span style="color: rgba(0, 0, 0, 1)">
gpgcheck</span>=1<span style="color: rgba(0, 0, 0, 1)">
enabled</span>=<span style="color: rgba(0, 0, 0, 1)">0
gpgkey</span>=https://nginx.org/keys/nginx_signing.key</pre>
</div>
<span class="cnblogs_code_collapse">vim /etc/yum.repos.d/nginx.repo</span></div>
<p>2、从新加载yum</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">yum clean all
yum makecache</span></pre>
</div>
<p>3、安装 nginx</p>
<div class="cnblogs_code">
<pre>yum install nginx -y</pre>
</div>
<p>4、修该配置文件,events同级添加</p>
<div class="cnblogs_code"><img id="code_img_closed_71653438-ca79-43d8-b232-dc1a7d113462" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_71653438-ca79-43d8-b232-dc1a7d113462" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_71653438-ca79-43d8-b232-dc1a7d113462" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">events {
worker_connections</span>1024<span style="color: rgba(0, 0, 0, 1)">;
}
stream {
log_format main </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">$remote_addr $upstream_addr - $time_local $status</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
access_log </span>/var/log/nginx/k8s-<span style="color: rgba(0, 0, 0, 1)">access.log main;
upstream k8s</span>-<span style="color: rgba(0, 0, 0, 1)">apiserver {
server </span>172.16.105.220:6443<span style="color: rgba(0, 0, 0, 1)">;
server </span>172.16.105.210:6443<span style="color: rgba(0, 0, 0, 1)">;
}
server {
listen </span>172.16.105.231:6443<span style="color: rgba(0, 0, 0, 1)">;
proxy_pass k8s</span>-<span style="color: rgba(0, 0, 0, 1)">apiserver;
}
}</span></pre>
</div>
<span class="cnblogs_code_collapse">vim /etc/nginx/nginx.conf</span></div>
<div class="cnblogs_code"><img id="code_img_closed_8dfc90c9-aa67-497b-93c4-aa38815cb9b6" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_8dfc90c9-aa67-497b-93c4-aa38815cb9b6" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_8dfc90c9-aa67-497b-93c4-aa38815cb9b6" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">参数说明:
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 创建四层负载均衡</span>
<span style="color: rgba(0, 0, 0, 1)">stream {
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 记录日志</span>
log_format main <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">$remote_addr $upstream_addr $time_local $status</span><span style="color: rgba(128, 0, 0, 1)">"</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 日志存放路径</span>
access_log /var/log/nginx/k8s-<span style="color: rgba(0, 0, 0, 1)">access.log main;
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 创建调度集群 k8s-apiserver 为服务名称</span>
upstream k8s-<span style="color: rgba(0, 0, 0, 1)">apiserver {
server </span>172.16.105.220:6443<span style="color: rgba(0, 0, 0, 1)">;
server </span>172.16.105.210:6443<span style="color: rgba(0, 0, 0, 1)">;
}
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 创建监听服务</span>
<span style="color: rgba(0, 0, 0, 1)"> server {
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 本地监听访问开启的使用IP与端口</span>
listen 172.16.105.231:6443<span style="color: rgba(0, 0, 0, 1)">;
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 调度的服务名称,由于是4层则不是用http</span>
proxy_pass k8s-<span style="color: rgba(0, 0, 0, 1)">apiserver;
}
}</span></pre>
</div>
<span class="cnblogs_code_collapse">参数说明:</span></div>
<p>5、启动nginx并生效配置文件</p>
<div class="cnblogs_code">
<pre>systemctl start nginx</pre>
</div>
<p>6、查看监听端口</p>
<div class="cnblogs_code"><img id="code_img_closed_7233326f-a3df-4c92-9446-75aa63867c19" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_7233326f-a3df-4c92-9446-75aa63867c19" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_7233326f-a3df-4c92-9446-75aa63867c19" class="cnblogs_code_hide">
<pre>tcp 0 0 172.16.105.231:6443 0.0.0.0:* LISTEN 19067/nginx: master</pre>
</div>
<span class="cnblogs_code_collapse">netstat -lnpt | grep 6443</span></div>
<p>8、修改每个Node 节点中配置文件。将引用的连接端,改为该负载均衡的机器内。</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">vim bootstrap.kubeconfig
server: https:</span>//172.16.105.231:6443<span style="color: rgba(0, 0, 0, 1)">
vim kubelet.kubeconfig
server: https:</span>//172.16.105.231:6443<span style="color: rgba(0, 0, 0, 1)">
vim kube</span>-<span style="color: rgba(0, 0, 0, 1)">proxy.kubeconfig
server: https:</span>//172.16.105.231:6443</pre>
</div>
<p>9、重启 kubelet Node 客户端</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">systemctl restart kubelet
systemctl restart kube</span>-proxy</pre>
</div>
<p>10、查看Node 启动进程</p>
<div class="cnblogs_code"><img id="code_img_closed_57d432a6-fb8a-441b-aec8-b4a9f2fd2140" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_57d432a6-fb8a-441b-aec8-b4a9f2fd2140" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_57d432a6-fb8a-441b-aec8-b4a9f2fd2140" class="cnblogs_code_hide">
<pre>root 23226 0.0 0.4 300552 16460 ? Ssl Aug08 0:25 /opt/kubernetes/bin/flanneld --ip-masq --etcd-endpoints=https://172.16.105.220:2379,https://172.16.105.230:2379,https://172.16.105.213:2379 -etcd-cafile=/opt/etcd/ssl/ca.pem -etcd-certfile=/opt/etcd/ssl/server.pem -etcd-keyfile=/opt/etcd/ssl/server-<span style="color: rgba(0, 0, 0, 1)">key.pem
root </span>26986 1.5 1.5 632676 60740 ? Ssl 11:30 0:01 /opt/kubernetes/bin/kubelet --logtostderr=false --log-dir=/opt/kubernetes/logs/ --v=4 --hostname-override=172.16.105.213 --kubeconfig=/opt/kubernetes/cfg/kubelet.kubeconfig --bootstrap-kubeconfig=/opt/kubernetes/cfg/bootstrap.kubeconfig --config=/opt/kubernetes/cfg/kubelet.config --cert-dir=/opt/kubernetes/ssl --pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0<span style="color: rgba(0, 0, 0, 1)">
root </span>27584 0.7 0.5 41588 19896 ? Ssl 11:32 0:00 /opt/kubernetes/bin/kube-proxy --logtostderr=true --v=4 --hostname-override=172.16.105.213 --cluster-cidr=10.0.0.0/24 --kubeconfig=/opt/kubernetes/cfg/kube-proxy.kubeconfig</pre>
</div>
<span class="cnblogs_code_collapse">ps -aux | grep kube</span></div>
<p>11、重启Master kube-apiserver</p>
<div class="cnblogs_code">
<pre>systemctl restart kube-apiserver</pre>
</div>
<p>12、查看Nginx日志</p>
<div class="cnblogs_code"><img id="code_img_closed_8137b3bf-6d2d-4c8a-b6a6-9c6187d12529" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_8137b3bf-6d2d-4c8a-b6a6-9c6187d12529" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_8137b3bf-6d2d-4c8a-b6a6-9c6187d12529" class="cnblogs_code_hide">
<pre>172.16.105.213 172.16.105.220:6443 09/Aug/2019:13:34:59 +0800 200
172.16.105.230 172.16.105.220:6443 09/Aug/2019:13:34:59 +0800 200
172.16.105.213 172.16.105.220:6443 09/Aug/2019:13:34:59 +0800 200
172.16.105.230 172.16.105.220:6443 09/Aug/2019:13:34:59 +0800 200
172.16.105.230 172.16.105.220:6443 09/Aug/2019:13:35:00 +0800 200</pre>
</div>
<span class="cnblogs_code_collapse">tail -f /var/log/nginx/k8s-access.log</span></div>
<h3>3<strong>、</strong><strong>部署 </strong><strong>Nginx2+keepalived 高可用</strong></h3>
<ul>
<li>注:VIP 要设置为证书授权过得ip否则会无法通过外网访问</li>
<li>注:安装Nginx2与单Nginx的安装步骤相同,这里我不再重复部署,只讲解重点。</li>
</ul>
<p>1、Nginx1与Nginx2安装keepalive高可用</p>
<div class="cnblogs_code">
<pre>yum -y install keepalived</pre>
</div>
<p>2、修改Nginx1 Master 主配置文件</p>
<div class="cnblogs_code"><img id="code_img_closed_a2d82d9e-90b5-478e-88cd-7e15057f0c1e" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_a2d82d9e-90b5-478e-88cd-7e15057f0c1e" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_a2d82d9e-90b5-478e-88cd-7e15057f0c1e" class="cnblogs_code_hide">
<pre>! Configuration File <span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> keepalived
global_defs {
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 接收邮件地址</span>
<span style="color: rgba(0, 0, 0, 1)"> notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 邮件发送地址</span>
<span style="color: rgba(0, 0, 0, 1)"> notification_email_from Alexandre.Cassen@firewall.loc
smtp_server </span>127.0.0.1<span style="color: rgba(0, 0, 0, 1)">
smtp_connect_timeout </span>30<span style="color: rgba(0, 0, 0, 1)">
router_id NGINX_MASTER
}
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 通过vrrp协议检查本机nginx服务是否正常</span>
<span style="color: rgba(0, 0, 0, 1)">vrrp_script check_nginx {
script </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/etc/keepalived/check_nginx.sh</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
}
vrrp_instance VI_1 {
state MASTER
interface ens32
virtual_router_id </span>51 <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> VRRP 路由 ID实例,每个实例是唯一的</span>
priority 100 <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 优先级,备服务器设置 90</span>
advert_int 1 <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 指定VRRP 心跳包通告间隔时间,默认1秒</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 密码认证</span>
<span style="color: rgba(0, 0, 0, 1)"> authentication {
auth_type PASS
auth_pass </span>1111<span style="color: rgba(0, 0, 0, 1)">
}
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> VIP</span>
<span style="color: rgba(0, 0, 0, 1)"> virtual_ipaddress {
</span>192.168.1.100/24<span style="color: rgba(0, 0, 0, 1)">
}
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 使用检查脚本</span>
<span style="color: rgba(0, 0, 0, 1)"> track_script {
check_nginx
}
}</span></pre>
</div>
<span class="cnblogs_code_collapse">vim /etc/keepalived/keepalived.conf</span></div>
<p>3、修改Nginx2 Slave 主配置文件</p>
<div class="cnblogs_code"><img id="code_img_closed_b95a25a6-015f-4c0f-a230-ae2c4a1a1761" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_b95a25a6-015f-4c0f-a230-ae2c4a1a1761" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_b95a25a6-015f-4c0f-a230-ae2c4a1a1761" class="cnblogs_code_hide">
<pre>! Configuration File <span style="color: rgba(0, 0, 255, 1)">for</span><span style="color: rgba(0, 0, 0, 1)"> keepalived
global_defs {
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 接收邮件地址</span>
<span style="color: rgba(0, 0, 0, 1)"> notification_email {
acassen@firewall.loc
failover@firewall.loc
sysadmin@firewall.loc
}
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 邮件发送地址</span>
<span style="color: rgba(0, 0, 0, 1)"> notification_email_from Alexandre.Cassen@firewall.loc
smtp_server </span>127.0.0.1<span style="color: rgba(0, 0, 0, 1)">
smtp_connect_timeout </span>30<span style="color: rgba(0, 0, 0, 1)">
router_id NGINX_MASTER
}
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 通过vrrp协议检查本机nginx服务是否正常</span>
<span style="color: rgba(0, 0, 0, 1)">vrrp_script check_nginx {
script </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">/etc/keepalived/check_nginx.sh</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">
}
vrrp_instance VI_1 {
state BACKUP
interface ens32
virtual_router_id </span>51 <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> VRRP 路由 ID实例,每个实例是唯一的</span>
priority 90 <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 优先级,备服务器设置 90</span>
advert_int 1 <span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 指定VRRP 心跳包通告间隔时间,默认1秒</span>
<span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 密码认证</span>
<span style="color: rgba(0, 0, 0, 1)"> authentication {
auth_type PASS
auth_pass </span>1111<span style="color: rgba(0, 0, 0, 1)">
}
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> VIP</span>
<span style="color: rgba(0, 0, 0, 1)"> virtual_ipaddress {
</span>192.168.1.100/24<span style="color: rgba(0, 0, 0, 1)">
}
</span><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 使用检查脚本</span>
<span style="color: rgba(0, 0, 0, 1)"> track_script {
check_nginx
}
}</span></pre>
</div>
<span class="cnblogs_code_collapse">vim /etc/keepalived/keepalived.conf</span></div>
<p> 4、Ngin1与Nginx2创建检查脚本</p>
<div class="cnblogs_code"><img id="code_img_closed_41b36e76-9743-4773-8b7d-4f4eac13a67b" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_41b36e76-9743-4773-8b7d-4f4eac13a67b" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_41b36e76-9743-4773-8b7d-4f4eac13a67b" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 128, 0, 1)">#</span><span style="color: rgba(0, 128, 0, 1)"> 检查nginx进程数</span>
count=$(ps -ef |grep nginx |egrep -cv <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">grep|$$</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">if</span> [ <span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">$count</span><span style="color: rgba(128, 0, 0, 1)">"</span> -<span style="color: rgba(0, 0, 0, 1)">eq 0 ];then
systemctl stop keepalived
fi</span></pre>
</div>
<span class="cnblogs_code_collapse">vim /etc/keepalived/check_nginx.sh</span></div>
<p>5、给脚本添加权限</p>
<div class="cnblogs_code">
<pre>chmod +x /etc/keepalived/check_nginx.sh</pre>
</div>
<p>6、Ngin1与Nginx2启动keepalived</p>
<div class="cnblogs_code">
<pre>systemctl start keepalived</pre>
</div>
<p>7、查看进程</p>
<div class="cnblogs_code"><img id="code_img_closed_b4fea762-95e8-43c0-b0cf-dc8fd525f6bd" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_b4fea762-95e8-43c0-b0cf-dc8fd525f6bd" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_b4fea762-95e8-43c0-b0cf-dc8fd525f6bd" class="cnblogs_code_hide">
<pre>root 1969 0.0 0.1 118608 1396 ? Ss 09:41 0:00 /usr/sbin/keepalived -<span style="color: rgba(0, 0, 0, 1)">D
root </span>1970 0.0 0.2 120732 2832 ? S 09:41 0:00 /usr/sbin/keepalived -<span style="color: rgba(0, 0, 0, 1)">D
root </span>1971 0.0 0.2 120732 2380 ? S 09:41 0:00 /usr/sbin/keepalived -D</pre>
</div>
<span class="cnblogs_code_collapse">ps aux | grep keepalived</span></div>
<p>8、Master 查看虚拟IP</p>
<div class="cnblogs_code"><img id="code_img_closed_cd127e73-00af-4c88-81de-329932e3627e" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_cd127e73-00af-4c88-81de-329932e3627e" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_cd127e73-00af-4c88-81de-329932e3627e" class="cnblogs_code_hide">
<pre>ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000<span style="color: rgba(0, 0, 0, 1)">
link</span>/ether 00:0c:29<span style="color: rgba(0, 0, 0, 1)">:3d:1c:d0 brd ff:ff:ff:ff:ff:ff
inet </span>192.168.1.115/24 brd 192.168.1.255 scope <span style="color: rgba(0, 0, 255, 1)">global</span><span style="color: rgba(0, 0, 0, 1)"> dynamic ens32
valid_lft 5015sec preferred_lft 5015sec
inet </span>192.168.1.100/24 scope <span style="color: rgba(0, 0, 255, 1)">global</span><span style="color: rgba(0, 0, 0, 1)"> secondary ens32
valid_lft forever preferred_lft forever
inet6 fe80::4db8:</span>8591:9f94:8837/64<span style="color: rgba(0, 0, 0, 1)"> scope link
valid_lft forever preferred_lft forever</span></pre>
</div>
<span class="cnblogs_code_collapse">ip addr</span></div>
<p>9、Slave 6、查看虚拟IP(没有就正常)</p>
<div class="cnblogs_code"><img id="code_img_closed_ae010fed-694e-474a-a281-25b3cdc28948" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_ae010fed-694e-474a-a281-25b3cdc28948" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_ae010fed-694e-474a-a281-25b3cdc28948" class="cnblogs_code_hide">
<pre>ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000<span style="color: rgba(0, 0, 0, 1)">
link</span>/ether 00:0c:29:09<span style="color: rgba(0, 0, 0, 1)">:b3:c4 brd ff:ff:ff:ff:ff:ff
inet </span>192.168.1.112/24 brd 192.168.1.255 scope <span style="color: rgba(0, 0, 255, 1)">global</span><span style="color: rgba(0, 0, 0, 1)"> dynamic ens32
valid_lft 7200sec preferred_lft 7200sec
inet6 fe80::1dbe:11ff:f093:ef49</span>/64<span style="color: rgba(0, 0, 0, 1)"> scope link
valid_lft forever preferred_lft forever</span></pre>
</div>
<span class="cnblogs_code_collapse">ip addr</span></div>
<p>10、测试</p>
<div class="cnblogs_code"><img id="code_img_closed_da2a38d8-84fa-4416-8939-e9d2bb143dad" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_da2a38d8-84fa-4416-8939-e9d2bb143dad" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_da2a38d8-84fa-4416-8939-e9d2bb143dad" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">测试IP飘逸
</span>1<span style="color: rgba(0, 0, 0, 1)">、关闭Master Nginx1
pkill nginx
</span>2<span style="color: rgba(0, 0, 0, 1)">、查看Slave Nginx2 虚拟IP是否飘逸
ip addr
</span>2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000<span style="color: rgba(0, 0, 0, 1)">
link</span>/ether 00:0c:29:09<span style="color: rgba(0, 0, 0, 1)">:b3:c4 brd ff:ff:ff:ff:ff:ff
inet </span>192.168.1.112/24 brd 192.168.1.255 scope <span style="color: rgba(0, 0, 255, 1)">global</span><span style="color: rgba(0, 0, 0, 1)"> dynamic ens32
valid_lft 4387sec preferred_lft 4387sec
inet </span>192.168.1.100/24 scope <span style="color: rgba(0, 0, 255, 1)">global</span><span style="color: rgba(0, 0, 0, 1)"> secondary ens32
valid_lft forever preferred_lft forever
inet6 fe80::1dbe:11ff:f093:ef49</span>/64<span style="color: rgba(0, 0, 0, 1)"> scope link
valid_lft forever preferred_lft forever
</span>3<span style="color: rgba(0, 0, 0, 1)">、启动Master Nginx1 keepalived 测试ip飘回
systemctl start nginx
systemctl start keepalived
</span>4<span style="color: rgba(0, 0, 0, 1)">、查看Nginx1 vip
ip addr
</span>2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000<span style="color: rgba(0, 0, 0, 1)">
link</span>/ether 00:0c:29<span style="color: rgba(0, 0, 0, 1)">:3d:1c:d0 brd ff:ff:ff:ff:ff:ff
inet </span>192.168.1.115/24 brd 192.168.1.255 scope <span style="color: rgba(0, 0, 255, 1)">global</span><span style="color: rgba(0, 0, 0, 1)"> dynamic ens32
valid_lft 7010sec preferred_lft 7010sec
inet </span>192.168.1.100/24 scope <span style="color: rgba(0, 0, 255, 1)">global</span><span style="color: rgba(0, 0, 0, 1)"> secondary ens32
valid_lft forever preferred_lft forever
inet6 fe80::4db8:</span>8591:9f94:8837/64<span style="color: rgba(0, 0, 0, 1)"> scope link
valid_lft forever preferred_lft forever</span></pre>
</div>
<span class="cnblogs_code_collapse">测试IP飘逸</span></div>
<p> 11、修改Nginx1 与 Nginx2 代理监听</p>
<div class="cnblogs_code"><img id="code_img_closed_3ef754b0-6584-492d-b2bb-29d0334b1b49" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_3ef754b0-6584-492d-b2bb-29d0334b1b49" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_3ef754b0-6584-492d-b2bb-29d0334b1b49" class="cnblogs_code_hide">
<pre><span style="color: rgba(0, 0, 0, 1)">stream {
log_format main </span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(128, 0, 0, 1)">$remote_addr $upstream_addr - $time_local $status</span><span style="color: rgba(128, 0, 0, 1)">"</span><span style="color: rgba(0, 0, 0, 1)">;
access_log </span>/var/log/nginx/k8s-<span style="color: rgba(0, 0, 0, 1)">access.log main;
upstream k8s</span>-<span style="color: rgba(0, 0, 0, 1)">apiserver {
server </span>192.168.1.108:6443<span style="color: rgba(0, 0, 0, 1)">;
server </span>192.168.1.109:6443<span style="color: rgba(0, 0, 0, 1)">;
}
server {
listen </span>0.0.0.0:6443<span style="color: rgba(0, 0, 0, 1)">;
proxy_pass k8s</span>-<span style="color: rgba(0, 0, 0, 1)">apiserver;
}
}</span></pre>
</div>
<span class="cnblogs_code_collapse">vim /etc/nginx/nginx.conf</span></div>
<p>12、重启nginx</p>
<div class="cnblogs_code">
<pre>systemctl restart nginx</pre>
</div>
<p> 13、接入K8S 修改所有Node配置文件IP为 VIP</p>
<p>1、修改配置文件</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">vim bootstrap.kubeconfig
server: https:</span>//192.168.1.100:6443<span style="color: rgba(0, 0, 0, 1)">
vim kube</span>-<span style="color: rgba(0, 0, 0, 1)">proxy.kubeconfig
server: https:</span>//192.168.1.100:6443</pre>
</div>
<p>2、重启Node</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">systemctl restart kubelet
systemctl restart kube</span>-proxy</pre>
</div>
<p>3、查看Master nginx1 日志</p>
<div class="cnblogs_code"><img id="code_img_closed_a02fa8c1-7e41-46c4-825e-8f84f93b679c" class="code_img_closed" src="https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif" alt=""><img id="code_img_opened_a02fa8c1-7e41-46c4-825e-8f84f93b679c" class="code_img_opened" style="display: none" src="https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif" alt="">
<div id="cnblogs_code_open_a02fa8c1-7e41-46c4-825e-8f84f93b679c" class="cnblogs_code_hide">
<pre>192.168.1.111 192.168.1.108:6443 - 22/Aug/2019:11:02:36 +0800 200
192.168.1.111 192.168.1.109:6443 - 22/Aug/2019:11:02:36 +0800 200
192.168.1.110 192.168.1.108:6443 - 22/Aug/2019:11:02:36 +0800 200
192.168.1.110 192.168.1.109:6443 - 22/Aug/2019:11:02:36 +0800 200
192.168.1.111 192.168.1.108:6443 - 22/Aug/2019:11:02:37 +0800 200</pre>
</div>
<span class="cnblogs_code_collapse">tail /var/log/nginx/k8s-access.log -f</span></div>
<p> </p><br><br>
来源:https://www.cnblogs.com/xiangsikai/p/11410261.html
頁:
[1]