k8s部署详细笔记の环境搭建(上)

一、 前言

本次搭建k8s环境主要是在linux进行搭建。具体思想逻辑需待完整学习后整理。

二、准备五台虚拟机,设置好网络

  1. 设置vmware子网和网关
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

  1. 创建五台虚拟机,分别取名为hdss248-11.host.comhdss248-12.host.comhdss248-21.host.comhdss248-22.host.comhdss248-200.host.com
    这里以创建hdss248-11.host.com为例
    进入虚拟机,编辑 vi /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=yes
NAME=ens33
UUID=6cacba56-6703-4fae-946c-2b58cf4b3998
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.248.11
GATEWAY=192.168.248.254
NETMAST=255.255.255.0
DNS1=8.8.8.8
ZONE=public
TYPE	       			  #网卡类型:"Ethernet" 为以太网
PROXY_METHOD     		  #代理方式:"none"关闭状态
BROWSER_ONLY 			  #只是浏览器:'no'否
BOOTPROTO   		      #IP的配置方法[none|static|bootp|dhcp](引导时不使用协议|静态分配IP|BOOTP协议|DHCP协议动态获取ip)
IPADDR     				  #本机地址(静态方式需要指定本地Ip,dhcp动态获取不需要这个字段)
NETMASK=24                #子网掩码
DEFROUTE 			   	  #默认路由"yes"
IPV4_FAILURE_FATAL  	  # 是否开启IPV4致命错误检测:"no" 否
IPV6INIT         		  # IPV6是否自动初始化: "yes"是  
IPV6_AUTOCONF     		  #IPV6是否自动配置:"yes"是
IPV6_DEFROUTE=  		  #IPV6是否可以为默认路由:"yes"是(现在还未用到IPV6,不会有任何影响)
IPV6_FAILURE_FATAL 		  #是否开启IPV6致命错误检测
IPV6_ADDR_GEN_MODE 		  # IPV6地址生成模型"stable-privacy"  
NAME          			  #网卡名字(与DEVICE一致)
UUID 					  #设备的惟一标识
DEVICE         			  #接口名(设备,网卡)
ONBOOT          		  #系统启动的时候网络接口是否有效(yes/no)
GATEWAY    				  #默认网关
DNS1=8.8.8.8	          #第一个DNS服务器指向 
ZONE=public
  1. 修改完重置并且测试网络
service network restart
ping baidu.com

在这里插入图片描述
如果ping的通,说明网络配置成功。

  1. 设置hostname:hostnamectl set-hostname hdss248-11.host.com

  2. 内核版本最好大于3.8,通过uname -a 进行查看

  3. 关闭防火墙并且设置开机不启动:systemctl stop firewalld -->systemctl disable firewalld

  4. 安装EPEL源:yum install epel-release -y

  5. 安装网络工具:yum install wget net-tools telnet tree nmap sysstat lrzsz dos2unix bind-utils -y
    同理12、21、22、200其他四个虚拟机也是一样的操作!

三、搭建dns服务器(bind9)

192.168.248.11搭建dns服务器即可

  1. 安装bind:yum install bind -y

  2. 修改配置文件: vi /etc/named.conf

    2.1 改成本机地址:listen-on port 53 { 192.168.248.131; }; ,去掉 listen-on-v6 port 53 { ::1; };
    2.2 改成任何机子都可查: allow-query { any; };
    2.3 在2.2下一行加上 上级地址,即前面设置的网关: forwarders { 192.168.248.254; };
    2.4 暂时关闭DNSSEC开关: dnssec-enable no; dnssec-validation no;
    2.5 保存退出,检查配置是否报错: named-checkconf

  3. 配置区域数据文件:vi /etc/named.rfc1912.zones , 在文件最后添加主机域和自定义域

zone "host.com" IN {
	 type master;
	 file "host.com.zone";
	 allow-update { 192.168.248.11; };
 };
	
zone "zhanzhk.com" IN {
	 type master;
	 file "zhanzhk.com.zone";
	 allow-update { 192.168.248.11; };
};
zhanzhk.com # 在实际的生产服务器上,这里填写的是你的完整域,及自定义域
type master; # 这里的master,表明是主dns,还有一个值是slave,表明是从dns。
file "zhanzhk.com.zone"; # 解析的记录文件。这个 "zhanzhk.com.zone"可以自己定义,定义完成后需要在 /var/named/ 目录下有一个名称相同的文件与之匹配。
allow-update { 192.168.248.11; }; # 是否允许客户端动态更新,none表明不允许。
  1. 加上主机域区域数据文件 :vi /var/named/host.com.zone
$TTL 600;10minutes
$ORIGIN host.com.
@ IN SOA dns.host.com. dnsadmin.host.com.	(
		2021053001; serial
		10800;refresh(3 hours)
		900; retry(15 minutes)
		604800; expire(1 week)
		86400;minimum(1 day)
		)
	NS dns.host.com.
$TTL 60;1minute
dns		A	192.168.248.11
HDSS248-11  	A	192.168.248.11
HDSS248-12  	A	192.168.248.12
HDSS248-21  	A	192.168.248.21
HDSS248-22  	A	192.168.248.22
HDSS248-200  	A	192.168.248.200

$TTL 600;设置有效地址解析记录的默认缓存时间,默认为1天也就是10分钟。
$ORIGIN host.com.
;@表示当前域host.com.,设置SOA记录为:dns.host.com.,域管理邮箱dnsadmin.host.com.,由于@有其他含义,所以用“.”代替@。
@ IN SOA dns.host.com. dnsadmin.host.com.	(
		2021053001; 更新序列号,用于标示数据库的变换,可以在10位以内,如果存在辅助DNS区域,建议每次更新完数据库,手动加1.
		10800;刷新时间,从域名服务器更新该地址数据库文件的间隔时间,默认为1天,这里是3小时
		900; 重试延时,从域名服务器更新地址数据库失败以后,等待多长时间,默认为为1小时,这里为15分钟
		604800; 到期,失效时间,超过该时间仍无法更新地址数据库,则不再尝试,默认为一周
		86400;设置无效地址解析记录(该数据库中不存在的地址)默认缓存时间。设置无效记录,最少缓存时间为3小时,这里为1天
		)
	NS dns.host.com.;域名服务器记录,指定该域名由dns.host.com进行分析,每个区在区根处至少包含一个NS记录.
$TTL 60;1minute
dns		A	192.168.248.11
HDSS248-11  	A	192.168.248.11;域名与ip地址的映射
HDSS248-12  	A	192.168.248.12
HDSS248-21  	A	192.168.248.21
HDSS248-22  	A	192.168.248.22
HDSS248-200  	A	192.168.248.200
  1. 加上zhanzhk域区域数据文件 :vi /var/named/zhanzhk.com.zone(这里的harbor是设置后面自定义镜像仓库的域名,提前设置,后面会做说明)
$TTL 600;10minutes
$ORIGIN zhanzhk.com.
@ IN SOA dns.zhanzhk.com. dnsadmin.zhanzhk.com.	(
		2021050702; serial
		10800;refresh(3 hours)
		900; retry(15 minutes)
		604800; expire(1 week)
		86400;minimum(1 day)
		)
	NS dns.zhanzhk.com.
$TTL 60;1minute
dns		A	192.168.248.11
harbor		A	192.168.248.200

  1. 检查: named-checkconf
  2. 启动DNS并设置为开机自启动: systemctl start named --> systemctl enable named
  3. 查看: netstat -luntp|grep 53
    在这里插入图片描述
  4. 测试:
    9.1 dig -t A hdss248-11.host.com @192.168.248.11 +short
    9.2 dig -t A hdss248-12.host.com @192.168.248.11 +short
    9.3 dig -t A hdss248-12.host.com @192.168.248.11 +short
    9.4 dig -t A hdss248-200.host.com @192.168.248.11 +short
    在这里插入图片描述
  5. 将DNS地址由8.8.8.8改为自己搭建的DNS: vi /etc/sysconfig/network-scripts/ifcfg-ens33
  6. 重置网络并且测试:
    11.1 service network restart
    11.2 相互ping 其他虚拟机的主机名(hdss248-12.host.com或者hdss248-12)
    11.3 ping baidu.com
    注:如果ping不通,请检查以下几个部分:
    -主机名是否成功修改
    -网络的DNS是否正确修改
    -防火墙是否成功关闭
  7. 将12、21、22、200四台服务器的DNS按照10-11-12操作一遍

四、签发证书

证书主要是用于客户端和服务端数据之间的通信传输。后面的签发证书统一在192.168.248.200完成,这里先创建一个基本证书,供后面使用。

  1. 下载插件:yum install -y wget
    注:wget是一个从网络上自动下载文件的自由工具。它支持HTTP,HTTPS和FTP协议,可以使用HTTP代理.
  2. 下载证书插件:
wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 -O /usr/bin/cfssl
wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 -O /usr/bin/cfssl-json
wget https://pkg.cfssl.org/R1.2/cfssl-certinfo_linux-amd64 -O /usr/bin/cfssl-certinfo
  1. 赋权限:chmod +x /usr/bin/cfssl*
  2. 可以通过which cfssl查看下载的证书工具
  3. 创建文件夹并且进入: mkdir /opt/certs —> cd /opt/certs/
  4. 创建生成CA证书签名请求(csr)的JSON配置文件:vi ca-csr.json
{
	"CN" : "Zhanzhk",
	"hosts" : [],
	"key" : {
		"algo" : "rsa",
		"size" : 2048
	},
	"names" : [
		{
			"C" : "CN",
			"ST" : "beijing",
			"L" : "beijing",
			"O" : "od",
			"OU" : "ops"
		}
	],
	"ca" : {
		"expiry" : "175200h"
	}
}
hosts:  字段指定授权使用该证书的 IP 和域名列表
CN:		 Common Name, 浏览器使用该字段验证网站是否合法,一般写的是域名
C:		 Country,国家
ST:	 State, 州,省
L:		 Locality,地区,城市
O:		 Organization Name,组织名称,公司名称
OU:		 Organization Unit Name, 组织单位名称,公司部门
expiry :过期时间
  1. 生成CA证书和私钥: cfssl gencert -initca ca-csr.json | cfssl-json -bare ca
  2. 验证证书:cfssl-certinfo -cert ca.pem

五、安装docker

192.168.248.21192.168.248.22192.168.248.200三台服务器安装docker,以192.168.248.21为例子

  1. 安装docker:curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
  2. 创建文件夹: mkdir /etc/docker
  3. 配置文件: vi /etc/docker/daemon.json
{
  "graph": "/data/docker",
  "storage-driver": "overlay2",
  "insecure-registries": ["registries.access.redhat.com","quay.io","harbor.zhanzhk.com"],
  "registry-mirrors": ["https://bh9y01q2.mirror.aliyuncs.com"],
  "bip": "172.248.21.1/24",
  "exec-opts": ["native.cgroupdriver=systemd"],
  "live-restore": true
}
{
  "graph": 已废弃,使用 data-root 代替, 这个主要看 docker 的版本
  "storage-driver": 配置为overlay2存储驱动(如果修改存储驱动的话,原来的镜像会消失,xfs文件系统)
  "insecure-registries":  镜像仓库地址,harbor.zhanzhk.com为自己搭建的镜像地址
  "registry-mirrors": 设置国内加速镜像地址,如阿里云
  "bip": 类似于docker0作用,ip资源池,为容器分配IP(网桥)
  "exec-opts":运行时执行选项
  "live-restore":当 dockerd 进程死掉后,是否 依旧保持容器存活
}
具体其他配置可看:https://editor.csdn.net/md/?articleId=117428543
  1. 递归创建 /data/docker目录:mkdir -p /data/docker
  2. 启动docker,设置开机启动docker:systemctl start docker —>systemctl enable docker
  3. 192.168.248.22192.168.248.200如上安装

六、搭建私有仓库harbor

私有仓库搭建在192.168.248.200服务器即可

  1. 下载harbor到本地,下载地址:https://github.com/goharbor/harbor/releases/tag/v1.9.3
    下载harbor-offline-installer-v1.9.3.tgz
  2. 创建文件夹:mkdir /opt/src
  3. harbor-offline-installer-v1.9.3.tgz上传到src底下
  4. 解压安装包到opt底下: tar -xf /opt/src/harbor-offline-installer-v1.9.3.tgz -C /opt/
  5. 改名并做个软链接:mv harbor harbor-v1.9.3—>ln -s /opt/harbor-v1.9.3/ /opt/harbor
    在这里插入图片描述
注:软链接ln -s ** **当我们需要在不同的目录,用到相同的文件时,我们只要在某个固定的目录,放上该文件,然后在 其它的目录下用ln命令链接(link)它就可以
    硬链接ln ** **,没有参数-s, 它会在你选定的位置上生成一个和源文件大小相同的文件
  1. 修改harbor目录底下的yml文件:vi /opt/harbor/harbor.yml
    6.1 hostname:harbor.zhanzhk.com
    6.2 port:180
    6.3 harbor_admin_password:ffcsict123
    6.4 location:/data/harbor/logs
    6.5 data_volume: /data/harbor
  2. 创建日志目录: mkdir -p /data/harbor/logs
  3. 下载docker-composeyum install docker-compose -y
  4. 校验:rpm -q docker-compose
  5. 启动harbor: cd /opt/harbor—> ./install.sh
  6. 查看是否启动正常:docker-compose ps
    在这里插入图片描述
  7. 下载nginx,实现地址端口转发:yum install nginx -y
  8. 新增 harbor.zhanzhk.com.confvi /etc/nginx/conf.d/harbor.zhanzhk.com.conf
server {
	listen	80;
	server_name	harbor.zhanzhk.com;	
	client_max_body_size	1000m;
	location /{
		proxy_pass http://127.0.0.1:180;
	}
}
server {
	listen	配置监听端口;
	server_name	配置访问域名;	
	client_max_body_size	设定通过nginx上传文件的大小;	
	location /{
		proxy_pass 设置被代理服务器的端口或套接字,以及URL;	
	}
}
https://www.cnblogs.com/ifindu-san/p/7249028.html
  1. 查看selinux 的开启状态,如果开启需要将其关闭,否则nginx会启动失败
    https://blog.csdn.net/lzm198707/article/details/50130615
    14.1 查看selinux开启状态:getenforce
    -------注:输出 disabledpermissive 为关闭, enforcing为开启
    14.2 临时关闭selinuxsetenforce 0 或者 setenforce 1
    -------注: 0 为设置selinux成为permissive模式 ,1为设置selinux成为enforcing模式
    14.3 永久关闭(推荐):vi /etc/selinux/config ,将SELINUX=enforcing改为SELINUX=disabled 重启即可

  2. 查看配置是否有误:nginx -t

  3. 启动nginx并且设置开机自启动: systemctl start nginx —> systemctl enable nginx
    注:如果启动报错,可以使用 journalctl -xe 查看详细的信息

  4. 通过域名查看harbor是否启动成功:curl harbor.zhanzhk.com
    在这里插入图片描述

  5. 然后本地window系统直接通过域名访问harbor:harbor.zhanzhk.com
    在这里插入图片描述

  6. 登录访问,账户密码为前面设置的:admin/ffcsict123

  7. 新建一个项目,记得勾选公开!!!!再说一次,记得勾选公开!!!
    在这里插入图片描述

  8. 测试上传镜像到自定义仓库:
    21.1 拉取nginx镜像:docker pull nginx:1.7.9
    21.2 查看镜像:docker images
    21.3 给镜像打标签:docker tag 84581e99d807 harbor.zhanzhk.com/myresposity/nginx:v1.7.9
    21.4 登录到自定义镜像仓库:docker login harbor.zhanzhk.com —>admin/ffcsict123
    24.5 推送镜像到自定义仓库:docker push harbor.zhanzhk.com/myresposity/nginx:v1.7.9
    24.6 推送结束后,去镜像仓库里面成查看,如果有推送则说明配置成功!
    在这里插入图片描述

七、安装部署主控节点etcd

192.168.248.200服务器签发证书,在192.168.248.12192.168.248.21192.168.248.22三台服务器集群etcd。
--------------------------------------首先在192.168.248.200配置生成需要签发的证书-------------------------------

  1. 创建基于根证书的config配置文件 :vi /opt/certs/ca-config.json
{
	"signing" : {
		"default" :{
			 "expiry" : "175200h"
		},	
		"profiles" : {
			"server" : {
				"expiry" : "175200h",
				"usages" : [
					"signing",
					"key encipherment",
					"server auth"			
				]	
			},	
			"client" : {
				"expiry" : "175200h",
				"usages" : [
					"signing",
					"key encipherment",
					"client auth"			
				]	
			},	
			"peer" : {
				"expiry" : "175200h",
				"usages" : [
					"signing",
					"key encipherment",
					"server auth",
					"client auth"			
				]	
			}						
		}
	}
}
证书解析:https://blog.csdn.net/weixin_40496191/article/details/117453844
  1. etcd证书请求文件:vi /opt/certs/etcd-peer-csr.json
{
	"CN" : "k8s-etcd",
	"hosts" : [
		"192.168.248.11",
		"192.168.248.12",
		"192.168.248.21",
		"192.168.248.22"
	],
	"key" : {
		"algo" : "rsa",
		"size" : 2048
	},
	"names" : [
		{
			"C" : "CN",
			"ST" : "beijing",
			"L" : "beijing",
			"O" : "od",
			"OU" : "ops"
		}
	]
}
  1. 签发证书: cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=peer etcd-peer-csr.json | cfssl-json -bare etcd-peer
    ------------------------------在12、21、22部署etcd,以192.168.248.12为例------------------------------
  2. 创建用户:useradd -s /sbin/nologin -M etcd
    4.1 检查:id etcd
  3. 下载etcd并且上传到/opt/src底下(自己创建src目录:mkdir /opt/src
    地址: https://github.com/etcd-io/etcd/releases/tag/v3.1.20
    5.1 解压:tar xvf etcd-v3.1.20-linux-amd64.tar.gz -C /opt
    5.2. 改名称: mv etcd-v3.1.20-linux-amd64 etcd-v3.1.20
    5.3. 软连接: ln -s /opt/etcd-v3.1.20 /opt/etcd
  4. 创建文件夹 mkdir -p /opt/etcd/certs/ /data/etcd /data/logs/etcd-server
  5. 192.168.248.200服务器的ca.pemetcd-peer-key.pemetcd-peer.pem 三个证书文件拷贝到12、21、22/opt/etcd/certs
  6. 创建etcd的启动脚本 vi /opt/etcd/etcd-server-startup.sh
#!/bin/sh
./etcd --name etcd-server-248-12 \
       --data-dir /data/etcd/etcd-server \
       --listen-peer-urls https://192.168.248.12:2380 \
       --listen-client-urls https://192.168.248.12:2379,http://127.0.0.1:2379 \
       --quota-backend-bytes 8000000000 \
       --initial-advertise-peer-urls https://192.168.248.12:2380 \
       --advertise-client-urls https://192.168.248.12:2379,http://127.0.0.1:2379 \
       --initial-cluster  etcd-server-248-12=https://192.168.248.12:2380,etcd-server-248-21=https://192.168.248.21:2380,etcd-server-248-22=https://192.168.248.22:2380 \
       --ca-file /opt/etcd/certs/ca.pem \
       --cert-file /opt/etcd/certs/etcd-peer.pem \
       --key-file /opt/etcd/certs/etcd-peer-key.pem \
       --client-cert-auth  \
       --trusted-ca-file /opt/etcd/certs/ca.pem \
       --peer-ca-file /opt/etcd/certs/ca.pem \
       --peer-cert-file /opt/etcd/certs/etcd-peer.pem \
       --peer-key-file /opt/etcd/certs/etcd-peer-key.pem \
       --peer-client-cert-auth \
       --peer-trusted-ca-file /opt/etcd/certs/ca.pem \
       --log-output stdout
#!/bin/sh
./etcd --name 名称
       --data-dir 				#数据目录的路径
       --listen-peer-urls 		#侦听对等流量的URL列表。接受来自其对等方的传入请求,方案可以是http或https
       --listen-client-urls	   	#侦听客户端流量的URL列表。接受来自其对等方的传入请求,方案可以是http或https
       --quota-backend-bytes    #后端大小超过给定配额时引发警报(0默认为低空间配额)
       --initial-advertise-peer-urls #此成员的对等URL的列表,以通告到集群的其余部分。这些地址用于在集群周围传递etcd数据。所有集群成员必须至少有一个路由。这些URL可以包含域名。
       --advertise-client-urls  #此成员的客户端URL的列表,以广播到集群的其余部分。这些URL可以包含域名。
       --initial-cluster  		#用于引导的初始群集配置。
       --ca-file			    #指向客户端服务器TLS CA证书文件的路径
       --cert-file 				#cert证书文件的路径。
       --key-file 				#key证书文件的路径。
       --client-cert-auth	    #启用客户端证书身份验证。
       --trusted-ca-file	    #CA证书文件的路径
       --peer-ca-file			#peer-ca证书文件的路径
       --peer-cert-file 		#peer-cert证书文件的路径。
       --peer-key-file			#peer-key证书文件的路径。
       --peer-client-cert-auth  #启用peer客户端证书身份验证。
       --peer-trusted-ca-file 	#peer-ca证书文件的路径
       --log-output stdout		#输出日志

  1. 赋予etcd-server-startup.sh执行权限: chmod +x etcd-server-startup.sh
  2. 将指定文件的拥有者改为指定的用户或组: chown -R etcd.etcd /opt/etcd-v3.1.20/chown -R etcd.etcd /data/etcd/chown -R etcd.etcd /data/logs/etcd-server
  3. etcd的启动程序放在后端进程上,需要下载:yum install supervisor -y
  4. 启动并且设置开机自启动supervisord:systemctl start supervisordsystemctl enable supervisord
    注:systemctl start supervisord / systemctl stop supervisord /systemctl restart supervisord
  5. 设置supervisord的启动文件:vi /etc/supervisord.d/etcd-server.ini
[program:etcd-server-248-12]
command=/opt/etcd/etcd-server-startup.sh                        ; the program (relative uses PATH, can take args)
numprocs=1                                                      ; number of processes copies to start (def 1)
directory=/opt/etcd                                             ; directory to cwd to before exec (def no cwd)
autostart=true                                                  ; start at supervisord start (default: true)
autorestart=true                                                ; retstart at unexpected quit (default: true)
startsecs=30                                                    ; number of secs prog must stay running (def. 1)
startretries=3                                                  ; max # of serial start failures (default 3)
exitcodes=0,2                                                   ; 'expected' exit codes for process (default 0,2)
stopsignal=QUIT                                                 ; signal used to kill process (default TERM)
stopwaitsecs=10                                                 ; max num secs to wait b4 SIGKILL (default 10)
user=etcd                                                       ; setuid to this UNIX account to run the program
redirect_stderr=true                                            ; redirect proc stderr to stdout (default false)
stdout_logfile=/data/logs/etcd-server/etcd.stdout.log           ; stdout log path, NONE for none; default AUTO
stdout_logfile_maxbytes=64MB                                    ; max # logfile bytes b4 rotation (default 50MB)
stdout_logfile_backups=4                                        ; # of stdout logfile backups (default 10)
stdout_capture_maxbytes=1MB                                     ; number of bytes in 'capturemode' (default 0)
stdout_events_enabled=false                                     ; emit events on stdout writes (default false)
[program:etcd-server-248-12]		; program后为进程名
command				     		    ; 启动脚本的相对位置
numprocs              			    ; 启动的进程数
directory                           ; 进程执行前,会切换到这个目录下执行
autostart					        ; 自动启动
autorestart				            ; 自动重启
startsecs	                        ; 启动30秒后没有异常退出,就表示进程正常启动了,默认为1秒
startretries	                    ; 启动失败自动重试次数,默认是3
exitcodes		                    ; exitcodes里面的定义的退出码是expected的。
stopsignal					        ; 停止信号,防止 kill 误操作
stopwaitsecs	                    ; 停止前等待的秒数
user					            ; 启动进程的用户
redirect_stderr			            ; 如果是true,则进程的stderr输出被发送回其stdout文件描述符上的
stdout_logfile				        ; 停止时打印日志
stdout_logfile_maxbytes	            ; stdout 日志文件大小,默认50MB
stdout_logfile_back                 ; stdout 日志文件备份数,默认是10 
stdout_capture_maxbytes		        ; 这个东西是设定capture管道的大小,当值不为0的时候,子进程可以从stdout 发送信息,而supervisor可以根据信息,发送相应的event
stdout_events_enabled               ; 当设置为ture的时候,当子进程由stdout向文件描述符中写日志的时候,将触发supervisord发送PROCESS_LOG_STDOUT类型的event
  1. 通过supervisorctl 启动etcd:supervisorctl update
    14.1 查看启动状态:supervisorctl status
    14.2 查看启动日志:tail -fn 200 /data/logs/etcd-server/etcd.stdout.log
    14.3 查看启动进程:netstat -luntp|grep etcd
    在这里插入图片描述
    在这里插入图片描述
  2. 192.168.248.21192.168.248.22配置如192.168.248.12,配置文件需要注意参数修改
  3. 全部配置后,查看集群状态:./etcdctl cluster-health ----> ./etcdctl member list
    在这里插入图片描述
    在这里插入图片描述
    说明etcd集群成功!

八、安装部署主控节点apiserver

192.168.248.21、192.168.248.22上安装apiserver,以192.168.248.21为例

--------------------------------------首先在192.168.248.200配置生成需要签发的证书-------------------------------

  1. /opt/certs目录下添加client的生成证书签名请求(csr)的JSON配置文件client-csr.json
{
	"CN" : "k8s-node",
	"hosts" : [],
	"key" : {
		"algo" : "rsa",
		"size" : 2048
	},
	"names" : [
		{
			"C" : "CN",
			"ST" : "beijing",
			"L" : "beijing",
			"O" : "od",
			"OU" : "ops"
		}
	]}
  1. 192.168.248.200服务器生成证书文件:cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client client-csr.json | cfssl-json -bare client
  2. /opt/certs目录下添加apiserver的生成证书签名请求(csr)的JSON配置文件apiserver-csr.json
{
	"CN" : "k8s-apiserver",
	"hosts" : [
	  "127.0.0.1",
	  "192.168.0.1",
	  "kubernetes.default",
      "kubernetes.default.svc",
      "kubernetes.default.svc.cluster",
      "kubernetes.default.svc.cluster.local",
	  "192.168.248.10",
	  "192.168.248.21",
	  "192.168.248.22"
	],
	"key" : {
		"algo" : "rsa",
		"size" : 2048
	},
	"names" : [
		{
			"C" : "CN",
			"ST" : "beijing",
			"L" : "beijing",
			"O" : "od",
			"OU" : "ops"
		}
	]
}
  1. 签发apiserver证书: cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server apiserver-csr.json | cfssl-json -bare apiserver

--------------------------------------回到192.168.248.21、192.168.248.22-------------------------------

  1. 下载k8s:https://github.com/kubernetes/kubernetes/releases/tag/v1.18.19 —> CHANGELOG -->Server Binaries第一个
    1.1 上传到/opt/src目录下,解压到opt目录下 : tar xf kubernetes-server-linux-amd64.tar.gz -C /opt/
    1.2 改名称: mv kubernetes kubernetes-v1.18.19
    1.3 软连接: ln -s /opt/kubernetes-v1.18.19 /opt/kubernetes
    1.4 删除源码包:cd kubernetes —> rm -fr kubernetes-src.tar.gz
    1.5 删除镜像包: cd server/bin —> rm -f *.tar —> rm -f *_tag
  2. /opt/kubernetes/server/bin 下面 创建cert目录,并且将证书弄过来:apiserver-key.pemapiserver.pemca-key.pemca.pemclient-key.pemclient.pem
  3. mkdir /opt/kubernetes/server/bin/conf
  4. 创建audit.yaml文件: vi /opt/kubernetes/server/bin/conf/audit.yaml
apiVersion: audit.k8s.io/v1beta1 # This is required.
kind: Policy
# Don't generate audit events for all requests in RequestReceived stage.
omitStages:
  - "RequestReceived"
rules:
  # Log pod changes at RequestResponse level
  - level: RequestResponse
    resources:
    - group: ""
      # Resource "pods" doesn't match requests to any subresource of pods,
      # which is consistent with the RBAC policy.
      resources: ["pods"]
  # Log "pods/log", "pods/status" at Metadata level
  - level: Metadata
    resources:
    - group: ""
      resources: ["pods/log", "pods/status"]

  # Don't log requests to a configmap called "controller-leader"
  - level: None
    resources:
    - group: ""
      resources: ["configmaps"]
      resourceNames: ["controller-leader"]

  # Don't log watch requests by the "system:kube-proxy" on endpoints or services
  - level: None
    users: ["system:kube-proxy"]
    verbs: ["watch"]
    resources:
    - group: "" # core API group
      resources: ["endpoints", "services"]

  # Don't log authenticated requests to certain non-resource URL paths.
  - level: None
    userGroups: ["system:authenticated"]
    nonResourceURLs:
    - "/api*" # Wildcard matching.
    - "/version"

  # Log the request body of configmap changes in kube-system.
  - level: Request
    resources:
    - group: "" # core API group
      resources: ["configmaps"]
    # This rule only applies to resources in the "kube-system" namespace.
    # The empty string "" can be used to select non-namespaced resources.
    namespaces: ["kube-system"]

  # Log configmap and secret changes in all other namespaces at the Metadata level.
  - level: Metadata
    resources:
    - group: "" # core API group
      resources: ["secrets", "configmaps"]

  # Log all other resources in core and extensions at the Request level.
  - level: Request
    resources:
    - group: "" # core API group
    - group: "extensions" # Version of group should NOT be included.

  # A catch-all rule to log all other requests at the Metadata level.
  - level: Metadata
    # Long-running requests like watches that fall under this rule will not
    # generate an audit event in RequestReceived.
    omitStages:
      - "RequestReceived"

  1. 创建k8s启动脚本:vi /opt/kubernetes-v1.18.19/server/bin/kube-apiserver.sh
#!/bin/bash
./kube-apiserver \
  --apiserver-count 2 \
  --audit-log-path /data/logs/kubernetes/kube-apiserver/audit-log \
  --audit-policy-file ./conf/audit.yaml \
  --authorization-mode RBAC \
  --client-ca-file ./cert/ca.pem \
  --requestheader-client-ca-file ./cert/ca.pem \
  --enable-admission-plugins NamespaceLifecycle,LimitRanger,ServiceAccount,DefaultStorageClass,DefaultTolerationSeconds,MutatingAdmissionWebhook,ValidatingAdmissionWebhook,ResourceQuota \
  --etcd-cafile ./cert/ca.pem \
  --etcd-certfile ./cert/client.pem \
  --etcd-keyfile ./cert/client-key.pem \
  --etcd-servers https://192.168.248.12:2379,https://192.168.248.21:2379,https://192.168.248.22:2379 \
  --service-account-key-file ./cert/ca-key.pem \
  --service-cluster-ip-range 192.168.0.0/16 \
  --service-node-port-range 3000-29999 \
  --target-ram-mb=1024 \
  --kubelet-client-certificate ./cert/client.pem \
  --kubelet-client-key ./cert/client-key.pem \
  --log-dir  /data/logs/kubernetes/kube-apiserver \
  --tls-cert-file ./cert/apiserver.pem \
  --tls-private-key-file ./cert/apiserver-key.pem \
  --v 2
  --requestheader-allowed-names aggregator \
  --requestheader-extra-headers-prefix X-Remote-Extra- \
  --requestheader-group-headers X-Remote-Group \
  --requestheader-username-headers X-Remote-User \
  --proxy-client-cert-file ./cert/kube-proxy-client.pem \
  --proxy-client-key-file ./cert/kube-proxy-client-key.pem

#!/bin/bash
./kube-apiserver \
  --apiserver-count        		#集群中运行的apiserver的数量,必须为一个正数。默认值:1在使用时--endpoint-reconciler-type=master-count时启用的
  --audit-log-path   			#日志输出路径
  --audit-policy-file  			#定义审计策略配置文件的路径
  --authorization-mode 			#在安全端口上执行授权的有序的插件列表。默认值:AlwaysAllow 以逗号分隔的列表:AlwaysAllow,AlwaysDeny,ABAC,Webhook,RBAC,Node.
  --client-ca-file				#如果设置,任何提交的客户ca文件中由某个权威机构签名的客户机证书的请求都使用与客户机证书的公共名称相对应的身份进行身份验证。
  --requestheader-client-ca-file	#根证书绑定包用于在信任--requestheader-username-headers指定的标头中的用户名前,在传入请求上验证客户证书。
  --enable-admission-plugins 	#除了默认启用的插件,额外启动的admission插件
  --etcd-cafile 			    #用于保护etcd通信的SSL证书权威文件。
  --etcd-certfile				#用于保护etcd通信的SSL证书文件。
  --etcd-keyfile				#用来保护etcd通信的SSL key文件
  --etcd-servers 				#连接的etcd服务器列表(格式://ip:port),以逗号分隔
  --service-account-key-file 	#包含PEM编码的x509 RSA或ECDSA私有或者公共密钥的文件。用于验证service account token。指定的文件可以包含多个值。该参数可以被指定多个不同的文件。如果没有指定,--tls-private-key-file将被使用。如果提供了 --service-account-signing-key,则必须指定该参数。
  --service-cluster-ip-range 	#CIDR IP范围,用于分配service 集群IP。不能与分配给节点pod的任何IP范围重叠。默认值:10.0.0.0/24  --service-node-port-range 3000-29999 \
  --target-ram-mb				#apiserver的内存限制(单位为MB)
  --kubelet-client-certificate 	#用于TLS的客户端证书文件路径
  --kubelet-client-key			#用于TLS的客户端私钥文件路径
  --log-dir 					#日志路径
  --tls-cert-file				#包含HTTPS的默认x509证书的文件。如果启用HTTPS服务,切没有提供--tls-cert-file和--tls-private-key-file,则为公共地址生成自签名证书和密钥,并保存到--cert-dir指定的目录中。
  --tls-private-key-file		#包含和--tls-cert-file配对的默认x509私钥的文件
  --v 2
  --requestheader-allowed-names			    #客户端证书常用名称列表,允许在--requestheader-username-headers指定的标头中提供用户名,如果为空,则允许在--requestheader-client-ca文件中通过当局验证的任何客户端证书。
  --requestheader-extra-headers-prefix 		#要检查的请求标头前缀列表
  --requestheader-group-headers 			#要检查组的请求标头列表
  --requestheader-username-headers 			#要检查用户名的请求标头列表
  --proxy-client-cert-file 					#用于证明aggregator或kube-apiserver在请求期间发出呼叫的身份的客户端证书。
  --proxy-client-key-file				    #用于证明聚合器或kube-apiserver的身份的客户端证书的私钥,当它必须在请求期间调用时使用。包括将请求代理给用户api-server和调用webhook admission插件
  1. 赋予启动脚本的权限: chmod +x kube-apiserver.sh
  2. 后台进程启动:vi /etc/supervisord.d/kube-apiserver.ini
[program:kube-apiserver-248.22]
command=/opt/kubernetes/server/bin/kube-apiserver.sh            ; the program (relative uses PATH, can take args)
numprocs=1                                                      ; number of processes copies to start (def 1)
directory=/opt/kubernetes/server/bin                            ; directory to cwd to before exec (def no cwd)
autostart=true                                                  ; start at supervisord start (default: true)
autorestart=true                                                ; retstart at unexpected quit (default: true)
startsecs=30                                                    ; number of secs prog must stay running (def. 1)
startretries=3                                                  ; max # of serial start failures (default 3)
exitcodes=0,2                                                   ; 'expected' exit codes for process (default 0,2)
stopsignal=QUIT                                                 ; signal used to kill process (default TERM)
stopwaitsecs=10                                                 ; max num secs to wait b4 SIGKILL (default 10)
user=root                                                       ; setuid to this UNIX account to run the program
redirect_stderr=true                                            ; redirect proc stderr to stdout (default false)
stdout_logfile=/data/logs/kubernetes/kube-apiserver/apiserver.stdout.log        ; stderr log path, NONE for none; default AUTO
stdout_logfile_maxbytes=64MB                                    ; max # logfile bytes b4 rotation (default 50MB)
stdout_logfile_backups=4                                        ; # of stdout logfile backups (default 10)
stdout_capture_maxbytes=1MB                                     ; number of bytes in 'capturemode' (default 0)
stdout_events_enabled=false                                     ; emit events on stdout writes (default false)

  1. 创建目录 :mkdir -p /data/logs/kubernetes/kube-apiserver
  2. supervisorctl update —>supervisorctl status —> netstat -luntp|grep kube-api
  3. 192.168.248.22服务器完成相同的操作

九、安装部署主控节点反代服务

192.168.248.11、192.168.248.12上部署主控节点反代服务,以192.168.248.11为例

  1. 安装nginxyum install nginx -y
  2. vi /etc/nginx/nginx.conf 配置文件设置L4反代 ,在最后加上下面一段
stream {
    upstream kube-apiserver {
        server 192.168.248.21:6443     max_fails=3 fail_timeout=30s;
        server 192.168.248.22:6443     max_fails=3 fail_timeout=30s;
    }
    server {
        listen 7443;
        proxy_connect_timeout 2s;
        proxy_timeout 900s;
        proxy_pass kube-apiserver;
    }
}

#负载均衡设置 用于负载均衡location(URL 匹配特定位置的设置)
stream {
    upstream kube-apiserver {
        server 192.168.248.21:6443     max_fails=3 fail_timeout=30s;
        server 192.168.248.22:6443     max_fails=3 fail_timeout=30s;
    }
    #主要用于指定 "主机" 和 "端口"和被代理地址
    server {
        listen 7443;
        proxy_connect_timeout 2s;
        proxy_timeout 900s;
        proxy_pass kube-apiserver;
    }
}
  1. 启动nginx并且设置为开机自启动:setenforce 0—>systemctl start nginx---->systemctl enable nginx
    永久关闭:修改/etc/selinux/config 文件 将SELINUX=enforcing改为SELINUX=disabled
  2. 设置keepalived:yum install keepalived -y
  3. 设置监听脚本:vi /etc/keepalived/check_port.sh
#!/bin/bash
#keepalived 监控端口脚本
#使用方法:
#在keepalived的配置文件中
#vrrp_script check_port {#创建一个vrrp_script脚本,检查配置
#    script "/etc/keepalived/check_port.sh 6379" #配置监听的端口
#    interval 2 #检查脚本的频率,单位(秒)
#}
CHK_PORT=$1
if [ -n "$CHK_PORT" ];then
        PORT_PROCESS=`ss -lnt|grep $CHK_PORT|wc -l`
        if [ $PORT_PROCESS -eq 0 ];then
                echo "Port $CHK_PORT Is Not Used,End."
                exit 1
        fi
else
        echo "Check Port Cant Be Empty!"
fi

  1. 执行权限:chmod +x /etc/keepalived/check_port.sh
  2. 配置主从keepalived,11为主,12为从: vi /etc/keepalived/keepalived.conf
    将配置文件的内容全部删除,加上以下这段:
! Configuration File for keepalived

global_defs {
   router_id 192.168.248.11

}

vrrp_script chk_nginx {
    script "/etc/keepalived/check_port.sh 7443"
    interval 2
    weight -20
}

vrrp_instance VI_1 {
    state MASTER
    interface ens33
    virtual_router_id 251
    priority 100
    advert_int 1
    mcast_src_ip 192.168.248.11
    nopreempt

    authentication {
        auth_type PASS
        auth_pass 11111111
    }
    track_script {
         chk_nginx
    }
    virtual_ipaddress {
        192.168.248.10
    }
}

! Configuration File for keepalived
global_defs {
	router_id 192.168.248.12
}
vrrp_script chk_nginx {
	script "/etc/keepalived/check_port.sh 7443"
	interval 2
	weight -20
}
vrrp_instance VI_1 {
	state BACKUP
	interface ens33
	virtual_router_id 251
	mcast_src_ip 192.168.248.2
	priority 90
	advert_int 1
	authentication {
		auth_type PASS
		auth_pass 11111111
	}
	track_script {
		chk_nginx
	}
	virtual_ipaddress {
		192.168.248.10
	}
}

! Configuration File for keepalived  #全局定义模块
global_defs {
   router_id 192.168.248.11  #运行keepalived机器的一个标识。router_id为负载均衡标识,在局域网内应该是唯一的。
}
#自定义脚本
vrrp_script chk_nginx {		
    script "/etc/keepalived/check_port.sh 7443"		#检测脚本
    interval 2			#执行间隔时间
    weight -20					
}
#VRRP实例定义块
vrrp_instance VI_1 {
    state MASTER  				 #状态只有MASTER和BACKUP两种,并且要大写,MASTER为工作状态,BACKUP是备用状态。
    interface ens33 			 #设置实例绑定的网卡 VRRP心跳包从哪块网卡发出
    virtual_router_id 251   	 #虚拟路由标识,同一个vrrp_instance的MASTER和BACKUP的vitrual_router_id 是一致的。根据优先级选举出一个主。
    priority 100 				 #优先级,同一个vrrp_instance的MASTER优先级必须比BACKUP高。
    advert_int 1				 #MASTER 与BACKUP 负载均衡器之间同步检查的时间间隔,单位为秒。
    mcast_src_ip 192.168.248.11  #发送多播包的地址,如果不设置默认使用绑定网卡的primary ip
    nopreempt				 	 #工作模式,nopreempt表示工作在非抢占模式,默认是抢占模式 preempt

    authentication {
        auth_type PASS  	 	#认证方式
        auth_pass 11111111   	#认证密码(密码只识别前8位)
    }
    track_script {				#追踪脚本,通常用于去执行上面的vrrp_script定义的脚本内容	
         chk_nginx				#自定义脚本
    }
    virtual_ipaddress {		 	#设置vip
        192.168.248.10
    }
}


  1. 启动keepalived :systemctl start keepalived —> systemctl enable keepalived —> systemctl status keepalived —> ip add可以看到192.168.248.10
    在这里插入图片描述
    在这里插入图片描述

注: “interface ens33"根据不同的虚拟机决定,有些网络配置是在ifcfg-ens33,则"interface ens33”,在ifcfg-eth0,则"interface eth0",否则查看运行状态会发现Active: inactive (dead)
9. keepalived.conf配置nopreempt,属于非抢占式,192.168.248.10不能随便转移
10. 在192.168.248.11: nginx -s stop,发现192.168.248.10转到了192.168.248.12底下,说明配置成功。
11. 然后重启nginx:systemctl start nginx —> systemctl restart keepalived,发现192.168.248.10回到了192.168.248.11

十、安装部署主控节点控制器、调度器服务

192.168.248.21、192.168.248.22上部署主控节点反代服务,以192.168.248.21为例

  1. 新增文件: vi /opt/kubernetes/server/bin/kube-controller-manager.sh
#!/bin/sh
./kube-controller-manager \
  --cluster-cidr 172.7.0.0/16 \
  --leader-elect true \
  --log-dir /data/logs/kubernetes/kube-controller-manager \
  --master http://127.0.0.1:8080 \
  --service-account-private-key-file ./cert/ca-key.pem \
  --service-cluster-ip-range 192.168.0.0/16 \
  --root-ca-file ./cert/ca.pem \
  --v 2

#!/bin/sh
./kube-controller-manager \
  --cluster-cidr  			#集群内的pod的CIDR范围,需要 --allocate-node-cidrs设为true
  --leader-elect  			#**在执行主逻辑之前,启动leader选举,并获得leader权。**当为了高可用运行多个组件的时候启用该参数。默认值:true
  --log-dir 				#日志所在目录
  --master 					#Kubernetes API server的地址(覆盖kubeconfig中的任意值)
  --service-account-private-key-file 	#包含用于签署service account token的PEM编码RSA或者ECDSA私钥的文件名
  --service-cluster-ip-range 			#集群Services 的CIDR范围。需要–allocate-node-cidrs设为true
  --root-ca-file			#如果设置,该根证书权限将包含service acount的toker secret。这必须是一个有效的PEM编码CA 包。
  --v 2
  1. 赋予运行权限:chmod +x /opt/kubernetes/server/bin/kube-controller-manager.sh
  2. 创建文件夹:mkdir -p /data/logs/kubernetes/kube-controller-manager
  3. 添加配置文件:vi /etc/supervisord.d/kube-conntroller-manager.ini
[program:kube-controller-manager-248-21]
command=/opt/kubernetes/server/bin/kube-controller-manager.sh                     ; the program (relative uses PATH, can take args)
numprocs=1                                                                        ; number of processes copies to start (def 1)
directory=/opt/kubernetes/server/bin                                              ; directory to cwd to before exec (def no cwd)
autostart=true                                                                    ; start at supervisord start (default: true)
autorestart=true                                                                  ; retstart at unexpected quit (default: true)
startsecs=30                                                                      ; number of secs prog must stay running (def. 1)
startretries=3                                                                    ; max # of serial start failures (default 3)
exitcodes=0,2                                                                     ; 'expected' exit codes for process (default 0,2)
stopsignal=QUIT                                                                   ; signal used to kill process (default TERM)
stopwaitsecs=10                                                                   ; max num secs to wait b4 SIGKILL (default 10)
user=root                                                                         ; setuid to this UNIX account to run the program
redirect_stderr=true                                                              ; redirect proc stderr to stdout (default false)
stdout_logfile=/data/logs/kubernetes/kube-controller-manager/controller.stdout.log  ; stderr log path, NONE for none; default AUTO
stdout_logfile_maxbytes=64MB                                                      ; max # logfile bytes b4 rotation (default 50MB)
stdout_logfile_backups=4                                                          ; # of stdout logfile backups (default 10)
stdout_capture_maxbytes=1MB                                                       ; number of bytes in 'capturemode' (default 0)
stdout_events_enabled=false                                                       ; emit events on stdout writes (default false)

  1. 更新运行进程:supervisorctl update
  2. 配置启动文件:vi /opt/kubernetes-v1.18.19/server/bin/kube-scheduler.sh
#!/bin/sh
./kube-scheduler \
  --leader-elect  \
  --log-dir /data/logs/kubernetes/kube-scheduler \
  --master http://127.0.0.1:8080 \
  --v 2

  1. 赋予执行权限:chmod +x /opt/kubernetes/server/bin/kube-scheduler.sh
  2. 创建文件夹:mkdir -p /data/logs/kubernetes/kube-scheduler
  3. 配置后台程序启动文件:vi /etc/supervisord.d/kube-scheduler.ini
[program:kube-scheduler-248-21]
command=/opt/kubernetes/server/bin/kube-scheduler.sh                     ; the program (relative uses PATH, can take args)
numprocs=1                                                               ; number of processes copies to start (def 1)
directory=/opt/kubernetes/server/bin                                     ; directory to cwd to before exec (def no cwd)
autostart=true                                                           ; start at supervisord start (default: true)
autorestart=true                                                         ; retstart at unexpected quit (default: true)
startsecs=30                                                             ; number of secs prog must stay running (def. 1)
startretries=3                                                           ; max # of serial start failures (default 3)
exitcodes=0,2                                                            ; 'expected' exit codes for process (default 0,2)
stopsignal=QUIT                                                          ; signal used to kill process (default TERM)
stopwaitsecs=10                                                          ; max num secs to wait b4 SIGKILL (default 10)
user=root                                                                ; setuid to this UNIX account to run the program
redirect_stderr=true                                                     ; redirect proc stderr to stdout (default false)
stdout_logfile=/data/logs/kubernetes/kube-scheduler/scheduler.stdout.log ; stderr log path, NONE for none; default AUTO
stdout_logfile_maxbytes=64MB                                             ; max # logfile bytes b4 rotation (default 50MB)
stdout_logfile_backups=4                                                 ; # of stdout logfile backups (default 10)
stdout_capture_maxbytes=1MB                                              ; number of bytes in 'capturemode' (default 0)
stdout_events_enabled=false                                              ; emit events on stdout writes (default false)
  1. supervisorctl update —> supervisorctl status
  2. 做软连接 :ln -s /opt/kubernetes/server/bin/kubectl /usr/bin/kubectl
  3. 查看集群状态 :cd /opt/kubernetes-v1.18.19/server/bin —>kubectl get cs
    在这里插入图片描述

十一、安装部署运算节点服务-kubelet

192.168.248.21、192.168.248.22上部署运算节点服务-kubelet,以192.168.248.21为例
--------------------------------------首先在192.168.248.200配置生成需要签发的证书-------------------------------

  1. 创建生成kubelet证书签名请求(csr)的JSON配置文件的: vi /opt/certs/kubelet-csr.json
    注:可以多写一些hosts节点,避免后面需要添加的时候重新生成证书
{
    "CN": "k8s-kubelet",
    "hosts": [
    "127.0.0.1",
    "192.168.248.10",
    "192.168.248.21",
    "192.168.248.22",
    "192.168.248.200",
    "192.168.248.136",
    "192.168.248.137",
    "192.168.248.138",
    "192.168.248.139",
    "192.168.248.140"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "ST": "beijing",
            "L": "beijing",
            "O": "od",
            "OU": "ops"
        }
    ]
}

  1. 生成证书:cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server kubelet-csr.json | cfssl-json -bare kubelet

--------------------------------------回到192.168.248.21,192.168.248.22-------------------------------

  1. 证书分发到 /opt/kubernetes-v1.18.19/server/bin/cert 目录下 kubelet-key.pemkubelet.pem
  2. 切换目录:cd /opt/kubernetes-v1.18.19/server/bin/conf
  3. set-cluster:执行以下指令
kubectl config set-cluster myk8s \
  --certificate-authority=/opt/kubernetes/server/bin/cert/ca.pem \
  --embed-certs=true \
  --server=https://192.168.248.10:7443 \
  --kubeconfig=kubelet.kubeconfig
  1. set-credentials:执行以下指令
kubectl config set-credentials k8s-node \
  --client-certificate=/opt/kubernetes/server/bin/cert/client.pem \
  --client-key=/opt/kubernetes/server/bin/cert/client-key.pem \
  --embed-certs=true \
  --kubeconfig=kubelet.kubeconfig 
  1. set-context:执行以下指令
kubectl config set-context myk8s-context \
  --cluster=myk8s \
  --user=k8s-node \
  --kubeconfig=kubelet.kubeconfig
  1. use-context:执行以下指令
kubectl config use-context myk8s-context --kubeconfig=kubelet.kubeconfig
  1. 注:执行步骤5-8后会生成kubelet.kubeconfig文件,打开里面的certificate-authority-data后的一串实际是将ca.pem进行编码转换的,echo “那串字符”| base64 -d 即可看到,所以ca.pem如果变了,需要重新执行
    在这里插入图片描述
  2. 角色绑定,授予k8s-node具有集群的权限 : cd /opt/kubernetes-v1.18.19/server/bin/conf —> vi k8s-node.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: k8s-node
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:node
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: k8s-node

  1. kubectl create -f k8s-node.yaml —>kubectl get clusterrolebinding k8s-node -o yaml

在这里插入图片描述
--------------------------------------在192.168.248.200启动kubernetes-------------------------------

  1. 需要下载pause镜像来启动kubernetes
    12.1 docker pull kubernetes/pause
    12.2 docker images查看IMAGE ID
    12.2 docker tag f9d5de079539 harbor.zhanzhk.com/myresposity/pause:latest
    12.3 docker push harbor.zhanzhk.com/myresposity/pause:latest

--------------------------------------回到192.168.248.21,192.168.248.22-------------------------------

  1. 创建kubernetes启动文件:vi /opt/kubernetes-v1.18.19/server/bin/kubelet.sh
#!/bin/sh
./kubelet \
  --anonymous-auth=false \
  --cgroup-driver systemd \
  --cluster-dns 192.168.0.2 \
  --cluster-domain cluster.local \
  --runtime-cgroups=/systemd/system.slice \
  --kubelet-cgroups=/systemd/system.slice \
  --fail-swap-on="false" \
  --client-ca-file ./cert/ca.pem \
  --tls-cert-file ./cert/kubelet.pem \
  --tls-private-key-file ./cert/kubelet-key.pem \
  --hostname-override hdss248-21.host.com \
  --image-gc-high-threshold 20 \
  --image-gc-low-threshold 10 \
  --kubeconfig ./conf/kubelet.kubeconfig \
  --log-dir /data/logs/kubernetes/kube-kubelet \
  --pod-infra-container-image harbor.zhanzhk.com/myresposity/pause:latest \
  --root-dir /data/kubelet
#!/bin/sh
./kubelet \
  --anonymous-auth 				# 不允许匿名请求到 kubelet 服务(默认 true )
  --cgroup-driver systemd		# kubelet 用来操作主机上的 cgroups 驱动,可选值有:“cgroupfs”和“systemd”(默认“cgroupfs”)--cgroup-root string 
  --cluster-dns  				# DNS 服务器的IP地址列表,逗号分隔。这个值是用于配置指定了“dnsPolicy=ClusterFirst”的容器 DNS 服务器。注意:列表中所有的DNS服务器必须提供相同的记录值,否则集群中的名称解析可能无法正常工作,也就是无法确保连接DNS服务器提供正确的名称解析
  --cluster-domain 				# 集群域名, kubelet 将配置所有容器除了主机搜索域还将搜索当前域。
  --runtime-cgroups				# 可选的 cgroups 的绝对名称,创建和运行时使用。
  --kubelet-cgroups				# 可选的 cgroups 的绝对名称来创建和运行 kubelet
  --fail-swap-on="false" \
  --client-ca-file 				# 集群ca证书
  --tls-cert-file 				# 包含用于 https 服务的 x509 证书的文件 (中间证书,如果有,在服务器认证后使用)。如果没有提供
  --tls-private-key-file 		# 包含 x509 私钥匹配的文件
  --hostname-override  			# 如果不是空,将使用该字符作为 hostname 而不是真实的 hostname 。
  --image-gc-high-threshold   	# 镜像占用磁盘比率最大值,超过此值将执行镜像垃圾回收。(默认 85)
  --image-gc-low-threshold 		# 镜像占用磁盘比率最小值,低于此值将停止镜像垃圾回收。
  --kubeconfig					# kubeconfig 文件的路径,用来指定如何连接到 API server ,此时将使用 --api-servers  除非设置了--require-kubeconfig 。(默认“/var/lib/kubelet/kubeconfig”)
  --log-dir 					# 日志存放路径
  --pod-infra-container-image	# 每个 pod 中的 network/ipc 名称空间容器将使用的镜像。 (默认 "gcr.io/google_containers/pause-amd64:3.0")
  --root-dir					# 管理 kubelet 文件的目录


  1. 启动权限: chmod +x /opt/kubernetes/server/bin/kubelet.sh
  2. 创建文件夹 :mkdir -p /data/logs/kubernetes/kube-kubelet /data/kubelet
  3. 创建后台程序启动配置: vi /etc/supervisord.d/kube-kubelet.ini
[program:kube-kubelet-248-21]
command=/opt/kubernetes/server/bin/kubelet.sh     ; the program (relative uses PATH, can take args)
numprocs=1                                        ; number of processes copies to start (def 1)
directory=/opt/kubernetes/server/bin              ; directory to cwd to before exec (def no cwd)
autostart=true                                    ; start at supervisord start (default: true)
autorestart=true              		          ; retstart at unexpected quit (default: true)
startsecs=30                                      ; number of secs prog must stay running (def. 1)
startretries=3                                    ; max # of serial start failures (default 3)
exitcodes=0,2                                     ; 'expected' exit codes for process (default 0,2)
stopsignal=QUIT                                   ; signal used to kill process (default TERM)
stopwaitsecs=10                                   ; max num secs to wait b4 SIGKILL (default 10)
user=root                                         ; setuid to this UNIX account to run the program
redirect_stderr=true                              ; redirect proc stderr to stdout (default false)
stdout_logfile=/data/logs/kubernetes/kube-kubelet/kubelet.stdout.log   ; stderr log path, NONE for none; default AUTO
stdout_logfile_maxbytes=64MB                      ; max # logfile bytes b4 rotation (default 50MB)
stdout_logfile_backups=4                          ; # of stdout logfile backups (default 10)
stdout_capture_maxbytes=1MB                       ; number of bytes in 'capturemode' (default 0)
stdout_events_enabled=false                       ; emit events on stdout writes (default false)

  1. 创建文件夹: mkdir -p /data/logs/kubernetes/kube-kubelet /data/kubelet
  2. 启动: supervisorctl update —> supervisorctl status
  3. 看看node是否已经加入集群 :kubectl get nodes
    在这里插入图片描述
  4. 给node添加角色:
主控节点:kubectl label node hdss248-21.host.com node-role.kubernetes.io/master=
运算节点:kubectl label node hdss248-21.host.com node-role.kubernetes.io/node=
主控节点:kubectl label node hdss248-22.host.com node-role.kubernetes.io/master=
运算节点:kubectl label node hdss248-22.host.com node-role.kubernetes.io/node=
  1. 再次查看:kubectl get nodes
    在这里插入图片描述

十二、安装部署运算节点服务kube-proxy

192.168.248.21、192.168.248.22上部署运算节点服务kube-proxy,以192.168.248.21为例
--------------------------------------首先在192.168.248.200配置生成需要签发的证书-------------------------------

  1. 创建生成kube-proxy证书签名请求(csr)的JSON配置文件的: vi /opt/certs/kube-proxy-csr.json
{
    "CN": "system:kube-proxy",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "ST": "beijing",
            "L": "beijing",
            "O": "od",
            "OU": "ops"
        }
    ]
}
  1. 生成证书: cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client kube-proxy-csr.json |cfssl-json -bare kube-proxy-client

---------------------------------回到192.168.248.21、192.168.248.22-------------------------------

  1. 证书分发到 /opt/kubernetes-v1.18.19/server/bin/cert目录下,kube-proxy-client.pemkube-proxy-client-key.pem
  2. cd /opt/kubernetes-v1.18.19/server/bin/conf
  3. set-cluster,执行以下:
kubectl config set-cluster myk8s \
  --certificate-authority=/opt/kubernetes/server/bin/cert/ca.pem \
  --embed-certs=true \
  --server=https://192.168.248.10:7443 \
  --kubeconfig=kube-proxy.kubeconfig
  1. set-credentials,执行以下:
kubectl config set-credentials kube-proxy \
  --client-certificate=/opt/kubernetes/server/bin/cert/kube-proxy-client.pem \
  --client-key=/opt/kubernetes/server/bin/cert/kube-proxy-client-key.pem \
  --embed-certs=true \
  --kubeconfig=kube-proxy.kubeconfig
  1. set-context,执行以下:
kubectl config set-context myk8s-context \
  --cluster=myk8s \
  --user=kube-proxy \
  --kubeconfig=kube-proxy.kubeconfig
  1. use-context,执行以下:
kubectl config use-context myk8s-context --kubeconfig=kube-proxy.kubeconfig
  1. 加载ipvs模块:vi /root/ipvs.sh
#!/bin/bash
ipvs_mods_dir="/usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs"
for i in $(ls $ipvs_mods_dir|grep -o "^[^.]*")
do
  /sbin/modinfo -F filename $i &>/dev/null
  if [ $? -eq 0 ];then
    /sbin/modprobe $i
  fi
done

  1. 赋予执行权限:chmod +x /root/ipvs.sh
  2. 执行:./ipvs.sh
    12.1 由于ipvs.sh是我从本地编辑后传到linux的,存在一些格式兼容问题
    12.2 报错:-bash: ./ipvs.sh: /bin/bash^M: 坏的解释器: 没有那个文件或目录
    12.3 解决:sed -i ‘s/\r$//’ ipvs.sh
  3. 查看: lsmod |grep ip_vs
  4. 创建启动脚本:vi /opt/kubernetes/server/bin/kube-proxy.sh
#!/bin/sh
./kube-proxy \
  --cluster-cidr 172.7.0.0/16 \
  --hostname-override hdss248-21.host.com \
  --proxy-mode=ipvs \
  --ipvs-scheduler=nq \
  --kubeconfig ./conf/kube-proxy.kubeconfig
#!/bin/sh
./kube-proxy \
  --cluster-cidr 		# 集群中 Pod 的CIDR范围。集群外的发送到服务集群IP的流量将被伪装,从pod发送到外部 LoadBalancer IP的流量将被定向到相应的集群IP
  --hostname-override 	# 使用该名字作为标识而不是实际的主机名
  --proxy-mode			# userspace / iptables / ipvs (默认为iptables)
  --ipvs-scheduler		# 当proxy模式设置为ipvs,ipvs调度的类型
  --kubeconfig 			# 具有授权信息的kubeconfig文件的路径

  1. 赋予执行权限:chmod +x /opt/kubernetes/server/bin/kube-proxy.sh
  2. 创建文件夹:mkdir -p /data/logs/kubernetes/kube-proxy
  3. 设置后台启动配置文件:vi /etc/supervisord.d/kube-proxy.ini
[program:kube-proxy-248-21]
command=/opt/kubernetes/server/bin/kube-proxy.sh                     ; the program (relative uses PATH, can take args)
numprocs=1                                                           ; number of processes copies to start (def 1)
directory=/opt/kubernetes/server/bin                                 ; directory to cwd to before exec (def no cwd)
autostart=true                                                       ; start at supervisord start (default: true)
autorestart=true                                                     ; retstart at unexpected quit (default: true)
startsecs=30                                                         ; number of secs prog must stay running (def. 1)
startretries=3                                                       ; max # of serial start failures (default 3)
exitcodes=0,2                                                        ; 'expected' exit codes for process (default 0,2)
stopsignal=QUIT                                                      ; signal used to kill process (default TERM)
stopwaitsecs=10                                                      ; max num secs to wait b4 SIGKILL (default 10)
user=root                                                            ; setuid to this UNIX account to run the program
redirect_stderr=true                                                 ; redirect proc stderr to stdout (default false)
stdout_logfile=/data/logs/kubernetes/kube-proxy/proxy.stdout.log     ; stderr log path, NONE for none; default AUTO
stdout_logfile_maxbytes=64MB                                         ; max # logfile bytes b4 rotation (default 50MB)
stdout_logfile_backups=4                                             ; # of stdout logfile backups (default 10)
stdout_capture_maxbytes=1MB                                          ; number of bytes in 'capturemode' (default 0)
stdout_events_enabled=false                                          ; emit events on stdout writes (default false)
  1. 启动: supervisorctl update
  2. 下载ipvsadmyum install ipvsadm -y
  3. 显示:ipvsadm -Ln
    在这里插入图片描述
  4. 显示:kubectl get svc
    在这里插入图片描述

十三、验证kubernetes集群

192.168.248.21、192.168.248.22上操作,以192.168.248.21为例

  1. vi /root/nginx-ds.yaml
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: nginx-ds
spec:
  template:
    metadata:
      labels:
        app: nginx-ds
    spec:
      containers:
      - name: my-nginx
        image: harbor.zhanzhk.com/myresposity/nginx:v1.7.9
        ports:
        - containerPort: 80

注:新版本的k8s已经不建议使用extensions/v1beta1,启动可能报错,需要改为:

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nginx-ds
spec:
  selector:
    matchLabels:
       app: nginx-ds
  template:
    metadata:
      labels:
        app: nginx-ds
    spec:
      containers:
      - name: my-nginx
        image: harbor.zhanzhk.com/myresposity/nginx:v1.7.9
        ports:
        - containerPort: 80

apiVersion:  				#与k8s集群版本有关,使用 kubectl api-versions 即可查看当前集群支持的版本
kind: 						#该配置的类型,我们使用的是 DaemonSet			
metadata:					#译名为元数据,即DaemonSet的一些基本属性和信息
  name: nginx-ds			#DaemonSet的名称
  labels:					#标签,可以灵活定位一个或多个资源,其中key和value均可自定义,可以定义多组,目前不需要理解
  	app: nginx-ds			#为该DaemonSet设置key为app,value为nginx的标签
spec:						#这是关于该DaemonSet的描述,可以理解为你期待该DaemonSet在k8s中如何使用
  replicas: 1				#使用该Deployment创建一个应用程序实例
  selector:					#标签选择器,与上面的标签共同作用,目前不需要理解
    matchLabels:			#选择包含标签app:nginx的资源
       app: nginx-ds
  template: 				#这是选择或创建的Pod的模板
    metadata:				#Pod的元数据
      labels:				#Pod的标签,上面的selector即选择包含标签app:nginx的Pod
        app: nginx-ds
    spec:					#期望Pod实现的功能(即在pod中部署)
      containers:			#生成container,与docker中的container是同一种
      - name: my-nginx		#container的名称
        image:  			#使用镜像nginx:1.7.9创建container,该container默认80端口可访问
        ports:
        - containerPort: 80	#对service暴露端口
        - 
 https://blog.csdn.net/ht9999i/article/details/107825425
  1. kubectl create -f nginx-ds.yaml
    注:如果需要删除daemonsetkubectl get all -n default —> kubectl delete -f nginx-ds.yaml

  2. 查看所有的pods:kubectl get pods
    在这里插入图片描述

    3.1问题一:pod节点一直处于 ContainerCreating状态
    在这里插入图片描述
    这里出现了点问题。可以看到容器一直处于正在创建的状态,后来才记起来,因为是重启了虚拟机,但是没有启动私有仓库harbor,所以重启私有仓库。

    3.2 问题二:harbor启动失败在这里插入图片描述
    可以看到这里提示harbor相关容器名称冲突了。 所以直接用docker ps -a查看所有容器,删除相关的harbor容器,重新启动harbor即可!启动后使用curl harbor.zhanzhk.com查看是否启动成功。

    3.3 问题三:启动harbor,pod还是启动失败,使用kubectl describe pod 节点名称查看,发现没有登录harbor,所以这里登录下docker login harbor.zhanzhk.com在这里插入图片描述
    3.4 问题四:pod还是启动失败,使用kubectl describe pod 节点名称查看,发现一直拉取镜像失败,提示没有登录或者仓库镜像不存在
    在这里插入图片描述
    但是这两个问题都不存在,仔细查看了下,发现我本地仓库设置为私有了、所以将其设置为公开,重新启动节点,成功!!!所以说还是得认真的跟着步奏走!!!

  3. 查看详细信息: kubectl get pods -o wide
    在这里插入图片描述

  4. 然后 curl 172.248.21.2curl 172.248.22.2
    在这里插入图片描述
    可以看到一个可以通,一个不能同。那是因为不同服务器上的pod节点间的网络还不通,需要后面设置网络!

十四、回顾证书

  1. 查看证书信息:cfssl-certinfo -cert apiserver.pem 或者openssl x509 -noout -in apiserver.pem -text
    在这里插入图片描述

    1.1 证书申请者信息:openssl x509 -noout -in apiserver.pem -subject
    1.2 证书发行者信息:openssl x509 -noout -in apiserver.pem -issuer
    1.3 证书有效期:openssl x509 -noout -in apiserver.pem -dates
    1.4 证书公钥: openssl x509 -noout -in apiserver.pem -pubkey
    1.5 证书公钥(通过csr公钥):openssl req -noout -in apiserver.csr -pubkey

  2. md5sum 校验192.168.248.21192.168.248.22kuberates的配置证书 :cd /opt/kubernetes-v1.18.19/server/bin/conf ----> md5sum kubelet.kubeconfig

  3. kubelet.kubeconfig文件的certificate-authority-data后的一串字符实际是将证书进行编码转换的,echo"那串字符"| base64 -d >证书.pem,再执行第1点就可以看到证书信息 。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  4. 可以去爬网站的证书信息:cfssl-certinfo -domain www.baidu.com

十五、kubectl之陈述式/声明式资源管理命令(可忽略)

--------------------------------------陈述式资源管理命令------------------------------------

注1:kubectl是官方的CLI命令行工具,用于与apiserver进行通信,将用户在命令行输入的命令,组织并转化为apiserver能识别的信息,进而实现管理K8S各种资源的一种有效途径。
注2:所有没指定名称空间的,默认访问default名称空间

  1. 名称空间
    1.1 查看名称空间: kubectl get namespace(namespace可以简写ns)
    1.2 创建名称空间: kubectl create ns app
    1.3 删除名称空间: kubectl delete ns app
    1.4 查看名称空间的所有资源 : kubectl get all -n kube-public
  2. pod控制器资源
    2.1 查看所有资源:kubectl get deploy -n kube-public
    2.2 创建单个资源:kubectl create deployment nginx-dp --image=harbor.zhanzhk.com/myresposity/nginx:v1.7.9 -n kube-public
    2.3 删除单个资源: kubectl delete deployment nginx-dp -n kube-public
    2.4 查看单个资源详细信息: kubectl describe deployment nginx-dp -n kube-public
  3. pod节点
    3.1 查看所有pod节点: kubectl get pods -n kube-public -o wide
    3.2 查看某个pod节点详细信息: kubectl describe deployment nginx-dp -n kube-public
    3.3 删除单个pod节点:kubectl delete pod 节点名称 -n kube-public(相当于重启:因为只删除pod而pod控制器还在,他会重新拉取,该pod跑到另一台集群机子上)
    3.4 查看删节点实时变化:watch -n 1 'kubectl describe deployment 资源名称 -n kube-public |grep -C 5 Event'
    3.5 扩容pod节点:kubectl scale deployment nginx-dp --replicas=2 -n kube-public
    3.6 进入节点:kubectl exec -ti 节点名称 /bin/bash -n kube-public (可以跨主机)
    3.7 进入节点: docker exec -ti 节点名称 /bin/bash (只能当前主机)
  4. service
    4.1 暴露service ,作为pod的固定接入点:kubectl expose deployment nginx-dp --port=80 -n kube-public(会产生一个固定不变虚拟ip)
    4.2 查看service:kubectl get svc nginx-dp -n kube-public(service缩写svc)
    4.3 查看service的ip和端口:ipvsadm -ln
    在这里插入图片描述
    4.4 查看service详细信息 :kubectl describe svc nginx-dp -n kube-public
    4.5 删除service:kubectl delete svc nginx-dp -n kube-public

--------------------------------------声明式资源管理命令------------------------------------

  1. 查看pod配置清单:kubectl get pods pod名称 -o yaml -n kube-public
  2. 查看资源配置清单:kubectl get svc 资源名称 -o yaml -n kube-public
  3. 解释资源配置清单:kubectl explain svc.metadata
    注:可以根据具体的清单信息参数,进行查询,如svc.spec.type
    在这里插入图片描述
  4. 创建资源配置清单:vi /root/nginx-ds-svc.yaml
apiVersion:  v1
kind: Service
metadata:
  labels:
    app: nginx-ds
  name: nginx-ds
  namespace: default
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx-ds
  sessionAffinity: None
  type: ClusterIP
apiVersion:  v1
kind: Service
metadata: 					#元数据
  labels:					#自定义标签属性列表
    app: nginx-ds
  name: nginx-ds 			#service的名称
  namespace: default		#命名空间  
spec:						#详细描述
  ports: 					#service需要暴露的端口列表
  - port: 80 				#服务监听的端口号
    protocol: TCP 			#端口协议,支持TCP和UDP,默认TCP
    targetPort: 80 			#需要转发到后端Pod的端口号
  selector:					#label selector配置,将选择具有label标签的Pod作为管理 
    app: nginx-ds
  sessionAffinity: None 	#是否支持session
  type: ClusterIP 			#service的类型,指定service的访问方式,默认为clusterIp

  1. kubectl create -f nginx-ds-svc.yaml -->kubectl get svc
    在这里插入图片描述
  2. kubectl get svc nginx-ds -o yaml
    在这里插入图片描述
  3. 修改service映射端口改为880(离线修改):
端口- port改为8080:vi  /root/nginx-ds-svc.yaml 
删除资源:kubectl  delete svc nginx-ds
应用资源: kubectl apply -f nginx-ds-svc.yaml
  1. 修改service映射端口改为880(在线修改) :kubectl edit svc nginx-dskubectl edit svc nginx-ds
  2. 删除service: kubectl delete -f nginx-ds-svc.yaml

十六、flannel部署

192.168.248.21、192.168.248.22上操作,以192.168.248.21为例

  1. cd /opt/src,下载flannel放在src下
    下载地址:https://github.com/coreos/flannel/releases/download/v0.11.0/flannel-v0.11.0-linux-amd64.tar.gz
    1.1 . 创建目录:mkdir /opt/flannel-v0.11.0
    1.2 . 解压:tar xf flannel-v0.11.0-linux-amd64.tar.gz -C /opt/flannel-v0.11.0/
    1.3 . 软连接:ln -s /opt/flannel-v0.11.0 /opt/flannel
  2. 创建证书文件夹:mkdir /opt/flannel/cert —> cd /opt/flannel/cert
    2.1 将ca.pemclient.pemclient-key.pem复制到这个文件夹下
  3. 将网络归到一个大的网段下: vi /opt/flannel/subnet.env
FLANNEL_NETWORK=172.248.0.0/16
FLANNEL_SUBNET=172.248.21.1/24
FLANNEL_MTU=1500
FLANNEL_IPMASQ=false
  1. 创建启动脚本: vi /opt/flannel/flanneld.sh
    注:iface=ens33 根据电脑的网络配置文件来
#!/bin/sh
./flanneld \
  --public-ip=192.168.248.21 \
  --etcd-endpoints=https://192.168.248.12:2379,https://192.168.248.21:2379,https://192.168.248.22:2379 \
  --etcd-keyfile=./cert/client-key.pem \
  --etcd-certfile=./cert/client.pem \
  --etcd-cafile=./cert/ca.pem \
  --iface=ens33 \
  --subnet-file=./subnet.env \
  --healthz-port=2401
#!/bin/sh
./flanneld \
  --public-ip			 	#其他节点可访问的IP,用于主机间通信。默认为用于通信的接口的IP。
  --etcd-endpoints			#逗号分隔的etcd端点列表
  --etcd-keyfile			#etcd通信的SSL密钥文件
  --etcd-certfile			#etcd通信的SSL认证文件
  --etcd-cafile				#etcd通信的SSL证书颁发机构文件。
  --iface=					#用于主机间通信的接口(IP或名称)
  --subnet-file				#写入env变量(子网和MTU值)的文件名。
  --healthz-port			#要侦听的healthz服务器的端口
http://www.qishunwang.net/news_show_157517.aspx
  1. 赋予执行权限:chmod +x /opt/flannel/flanneld.sh
  2. 创建文件夹: mkdir -p /data/logs/flanneld
  3. flanneld是基于etcd进行存储网络配置信息的,所以需要配置网络
    7.1 可以通过cd /opt/etcd --> ./etcdctl member list查看etcd主从信息
    在这里插入图片描述
    7.2 配置网络信息: ./etcdctl set /coreos.com/network/config '{"Network": "172.248.0.0/16", "Backend": {"Type": "host-gw"}}'(还有VxLAN和直接路由模型)
    7.3 查看是否配置成功:./etcdctl get /coreos.com/network/config
    在这里插入图片描述
  4. 编写flannel的后台启动配置文件:vi /etc/supervisord.d/flannel.ini
[program:flanneld-248-21]
command=/opt/flannel/flanneld.sh                             ; the program (relative uses PATH, can take args)
numprocs=1                                                   ; number of processes copies to start (def 1)
directory=/opt/flannel                                       ; directory to cwd to before exec (def no cwd)
autostart=true                                               ; start at supervisord start (default: true)
autorestart=true                                             ; retstart at unexpected quit (default: true)
startsecs=30                                                 ; number of secs prog must stay running (def. 1)
startretries=3                                               ; max # of serial start failures (default 3)
exitcodes=0,2                                                ; 'expected' exit codes for process (default 0,2)
stopsignal=QUIT                                              ; signal used to kill process (default TERM)
stopwaitsecs=10                                              ; max num secs to wait b4 SIGKILL (default 10)
user=root                                                    ; setuid to this UNIX account to run the program
redirect_stderr=true                                         ; redirect proc stderr to stdout (default false)
stdout_logfile=/data/logs/flanneld/flanneld.stdout.log       ; stderr log path, NONE for none; default AUTO
stdout_logfile_maxbytes=64MB                                 ; max # logfile bytes b4 rotation (default 50MB)
stdout_logfile_backups=4                                     ; # of stdout logfile backups (default 10)
stdout_capture_maxbytes=1MB                                  ; number of bytes in 'capturemode' (default 0)
stdout_events_enabled=false  

  1. 启动:supervisorctl update —> supervisorctl status
    注: 单独启动某个程序:supervisorctl start flanneld-248-21
  2. 测试
    10.1 查看pod节点的ip:kubectl get pod -o wide
    在这里插入图片描述
    10.2 相互ping,可以从192.168.248.21 或者进入172.248.22.2pod节点 ping 172.248.22.2,如果ping通,则说明网络配置成功!
  3. flannel原理(可忽略)
    11.1 查看路由: route -n,可以看到 flannelhost-gw模型主要作用是添加静态路由
    注:添加路由:route add -net 172.248.21.0/24 gw 192.168.248.21 dev ens33
    flannel实际上的作用就是增加路由,如果你的k8s规模足够小,可以自己实现路由,不一定需要flannel
    在这里插入图片描述
    11.2 如果想要停止host-gw模型,则需要先停止flannel,再删除路由:route del -net 172.248.22.0/24 gw 192.168.248.22
    11.3 host-gw模型的前提:所有的宿主机都要处于同一个二层网络下,即他们指向的是同一个物理网关设备
    11.4 flannelVxLAN模型:宿主机处于三级网络下,网关通过路由联通。如果有两个宿主机,则就在两个宿主机上实例化出了两个虚拟设备,在通过flanner网络隧道联通。
    即宿主机一想要访问宿主机二的pod,则封包到虚拟设备1,在通过flanner网络隧道联通到虚拟设备2,虚拟设备2进行拆包,传给宿主机二的pod。
    11.5 flannel直接路由模型是 host-gw模型和VxLAN模型的结合,即根据网络层级自动判断使用 host-gw模型和VxLAN模型。

十七、flannel之SNAT规则优化

192.168.248.21、192.168.248.22上操作,以192.168.248.21为例
---------------------------------------------可忽略-------------------------------------------

  1. 重新命名nginx镜像,版本号设置为curl并且推送到harbor仓库
docker images
docker tag  84581e99d807  harbor.zhanzhk.com/myresposity/nginx:curl
docker push  harbor.zhanzhk.com/myresposity/nginx:curl

在这里插入图片描述

  1. 修改yaml镜像,将nginx版本改为curl: vi nginx-ds.yaml
    在这里插入图片描述

  2. 应用:kubectl apply -f nginx-ds.yaml

  3. 查看pod并且重启:kubectl get pod —>kubectl delete pod nginx-ds-66x4n
    注:前面说过,只要pod控制器还在,删除pod不会真正删除,而是删除重新构建。

  4. 进入192.168.248.21的pod容器:kubectl exec -ti nginx-ds-7r7r5 /bin/bash

  5. 在pod里面操作:curl 172.248.22.2
    注:因为我的pod没有curl命令,并且我的pod没法访问外网。所以实际上curl操作在这里是没法实现的。需要等到后面部署了coredns后,pod才能访问外网,安装curl,所以这大点关于curl的命令可以选择跳过,先根据文档操作,后面再回来验证。安装指令如下:

tee /etc/apt/sources.list << EOF
deb http://mirrors.163.com/debian/ jessie main non-ffree contrib
deb http://mirrirs.163.com/dobian/ jessie-updates main non-free contrib
EOF

apt-get update && apt-get install -y curl telnet 
  1. 192.168.248.22查看pod日志:kubectl logs -f nginx-ds-7r7r5
    在这里插入图片描述

可以看到我们在pod进行curl,但是ip却显示宿主机的ip,而不显示pod分配的ip,这是有问题的,所以需要修改配置。

---------------------------------------------进入正题-------------------------------------------

  1. iptables-save |grep -i postrouting
    在这里插入图片描述
    这里的意思是在192.168.248.21的主机上,来源地址是172.7.21.0/24,并且不是从docker0网络设备出网的,就进行源地址转换。但是没有规定目标地址,因为我们的pod网络是处于172.248.0.0/16段,所以还需要规定目标地址如果为172.248.0.0/16则不需要做源地址转换。

  2. 下载iptables-servicesyum install iptables-services -y

  3. 启动、设置开启自启动:systemctl start iptables.service -->systemctl enable iptables.service

  4. 优化iptables规则1:iptables-save |grep -i postrouting
    11.1 删除规则:iptables -t nat -D POSTROUTING -s 172.248.21.0/24 ! -o docker0 -j MASQUERADE
    11.2 新增规则:iptables -t nat -I POSTROUTING -s 172.248.21.0/24 ! -d 172.248.0.0/16 ! -o docker0 -j MASQUERADE
    注:不是从 docker0触网,也不是去往172.248.0.0/16网络的,才进行SNAT转换
    11.3 再次查看规则:iptables-save |grep -i postrouting
    在这里插入图片描述
    11.4 保存规则:iptables-save > /etc/sysconfig/iptables
    11.5 本人机子重启发现是iptable启动失败,暂未解决。只能重启iptables来读取iptables文件,才能使修改的规则生效:systemctl restart iptables
    注:朋友说不需要做规则,这些活kube-proxy会干,所以跳过,不深究,如果暂时需要,则启动机子后,手动重启iptables即可。

  5. 优化iptables规则2:iptables-save |grep -i reject

    12.1 删除规则:iptables -t filter -D INPUT -j REJECT --reject-with icmp-host-prohibited
    12.2 删除规则:iptables -t filter -D FORWARD -j REJECT --reject-with icmp-host-prohibited
    12.3 保存规则:iptables-save > /etc/sysconfig/iptables

  6. 重新进入容器curl、查看日志,可以发现ip变成容器ip了。
    在这里插入图片描述

十八、安装coredns

注:后面不再以二进制的方式部署,而是往k8s交付容器的方式去交付服务
192.168.248.200上操作:

  1. 概念
    1.1 服务发现就是服务(应用)之间相互定位的过程
    1.2 服务发现并非云计算时代独有的,传统的单体架构也有
    —>服务(应用)的动态性强
    —>服务(应用)更新发布频繁
    —>服务(应用)支持自动伸缩
    1.3 在K8S集群里,pod的ip是不断变化的,如何以不变应万变
    —>抽象出了service资源,通过标签选择器,关联一组pod
    —>抽象出了集群网络,通过相对固定的 “集群IP”,使服务接入点固定
    1.4 自动关联service资源的 “名称” 和 “集群网络IP”,从而达到服务被集群自动发现的目的
  2. 部署K8S的内网资源配置清单http服务:在192.168.248.200服务器上,配置一个nginx虚拟主机,用以提供k8s统一的资源配置清单访问入口。vim /etc/nginx/conf.d/k8s-yaml.zhanzhk.com.conf
server {
	listen	80;
	server_name	harbor.zhanzhk.com;
	client_max_body_size	1000m;	
	location /{
		proxy_pass http://127.0.0.1:180;
	}
}
  1. 创建目录:mkdir -p /data/k8s-yaml

  2. 重新加载:nginx -t

  3. 重新加载:nginx -s reload
    --------------------------------------回到192.168.248.11------------------------------------

  4. 由于前面定义了域名harbor.zhanzhk.com,所以需要从dns服务器定义一个: vi /var/named/zhanzhk.com.zone

$TTL 600;10minutes
$ORIGIN zhanzhk.com.
@ IN SOA dns.zhanzhk.com. dnsadmin.zhanzhk.com. (
                2021050702; serial
                10800;refresh(3 hours)
                900; retry(15 minutes)
                604800; expire(1 week)
                86400;minimum(1 day)
                )
        NS dns.zhanzhk.com.
$TTL 60;1minute
dns             A       192.168.248.11
harbor          A       192.168.248.200
k8s-yaml        A       192.168.248.200
  1. 重启:systemctl restart named
  2. 测试: dig -t A k8s-yaml.zhanzhk.com @192.168.248.11 +short
    在这里插入图片描述
    --------------------------------------回到192.168.248.200------------------------------------
  3. cd /data/k8s-yaml —>mkdir coredns
  4. 去浏览器访问:http://k8s-yaml.zhanzhk.com/
    在这里插入图片描述
  5. 下载coredns:docker pull coredns/coredns:1.6.1
    11.1 修改标签:docker tag c0f6e815079e harbor.zhanzhk.com/myresposity/coredns:v1.6.1
    11.2 推送标签:docker push harbor.zhanzhk.com/myresposity/coredns:v1.6.1
  6. 切换路径并且添加文件:cd /data/k8s-yaml/coredns
    注:以下添加的四个文件在官网可以找到资料:https://github.com/kubernetes/kubernetes/blob/master/cluster/addons/dns/coredns/coredns.yaml.base
  7. 添加service文件: vi svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: coredns
  namespace: kube-system
  labels:
    k8s-app: coredns
    kubernetes.io/cluster-service: "true"
    kubernetes.io/name: "CoreDNS"
spec:
  selector:
    k8s-app: coredns
  clusterIP: 192.168.0.2
  ports:
  - name: dns
    port: 53
    protocol: UDP
  - name: dns-tcp
    port: 53
  - name: metrics
    port: 9153
    protocol: TCP

apiVersion: v1
kind: Service
metadata:					#元数据
  name 						#名称
  namespace					#命名空间
  labels:					#标签信息
    k8s-app: coredns
    kubernetes.io/cluster-service: "true"
    kubernetes.io/name: "CoreDNS"
spec:						#定义Service模板
  selector:					#定义标签选择器
    k8s-app: coredns
  clusterIP: 192.168.0.2	#指定svc ip地址 不指定则随机 
  ports:					#service需要暴露的端口列表
  - name: dns				#端口名称
    port: 53				#服务监听的端口号
    protocol: UDP			#端口协议,支持TCP和UDP,默认TCP
  - name: dns-tcp			#端口名称
    port: 53				#服务监听的端口号
  - name: metrics			#端口名称
    port: 9153				#服务监听的端口号
    protocol: TCP			#端口协议,支持TCP和UDP,默认TCP


  1. 添加权限文件:rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: coredns
  namespace: kube-system
  labels:
      kubernetes.io/cluster-service: "true"
      addonmanager.kubernetes.io/mode: Reconcile
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  labels:
    kubernetes.io/bootstrapping: rbac-defaults
    addonmanager.kubernetes.io/mode: Reconcile
  name: system:coredns
rules:
- apiGroups:
  - ""
  resources:
  - endpoints
  - services
  - pods
  - namespaces
  verbs:
  - list
  - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
  labels:
    kubernetes.io/bootstrapping: rbac-defaults
    addonmanager.kubernetes.io/mode: EnsureExists
  name: system:coredns
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:coredns
subjects:
- kind: ServiceAccount
  name: coredns
  namespace: kube-system

apiVersion: v1						#指定api版本,此值必须在kubectl apiversion中  
kind: ServiceAccount				# 创建服务账户
metadata:							#元数据
  name: coredns						#资源的名字
  namespace: kube-system			#资源空间
  labels:							#设定资源的标签
      kubernetes.io/cluster-service: "true"
      addonmanager.kubernetes.io/mode: Reconcile
---
apiVersion: rbac.authorization.k8s.io/v1	#指定api版本,此值必须在kubectl apiversion中  
kind: ClusterRole							#创建集群角色
metadata:									#元数据
  labels:									#设定资源的标签
    kubernetes.io/bootstrapping: rbac-defaults
    addonmanager.kubernetes.io/mode: Reconcile
  name: system:coredns						#集群角色的名字
rules:				#定义角色权限规则				
- apiGroups:		#核心API组
  - ""
  resources:		#操作资源
  - endpoints
  - services
  - pods
  - namespaces
  verbs:		  	#操作权限
  - list
  - watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding				#角色绑定,绑定集群角色和服务账户
metadata:								#元数据
  annotations:							#设置自定义注解列表  
    rbac.authorization.kubernetes.io/autoupdate: "true"
  labels:								#设定资源的标签
    kubernetes.io/bootstrapping: rbac-defaults
    addonmanager.kubernetes.io/mode: EnsureExists
  name: system:coredns					#资源的名字
roleRef:								#绑定角色权限
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole						
  name: system:coredns				
subjects:								#绑定服务账户
- kind: ServiceAccount
  name: coredns
  namespace: kube-system


  1. 添加pod控制器文件:vi dp.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: coredns
  namespace: kube-system
  labels:
    k8s-app: coredns
    kubernetes.io/name: "CoreDNS"
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: coredns
  template:
    metadata:
      labels:
        k8s-app: coredns
    spec:
      priorityClassName: system-cluster-critical
      serviceAccountName: coredns
      containers:
      - name: coredns
        image: harbor.zhanzhk.com/myresposity/coredns:v1.6.1
        args:
        - -conf
        - /etc/coredns/Corefile
        volumeMounts:
        - name: config-volume
          mountPath: /etc/coredns
        ports:
        - containerPort: 53
          name: dns
          protocol: UDP
        - containerPort: 53
          name: dns-tcp
          protocol: TCP
        - containerPort: 9153
          name: metrics
          protocol: TCP
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
            scheme: HTTP
          initialDelaySeconds: 60
          timeoutSeconds: 5
          successThreshold: 1
          failureThreshold: 5
      dnsPolicy: Default
      volumes:
        - name: config-volume
          configMap:
            name: coredns
            items:
            - key: Corefile
              path: Corefile

apiVersion: apps/v1			#指定api版本,此值必须在kubectl apiversion中  
kind: Deployment 			#指定创建资源的角色/类型  
metadata: 					#资源的元数据/属性  
  name: coredns				#资源的名字,在同一个namespace中必须唯一  
  namespace: kube-system	#资源空间
  labels:				 	#设定资源的标签
    k8s-app: coredns
    kubernetes.io/name: "CoreDNS"
spec:  						#设置该资源的内容  
  replicas: 1				#副本数量
  selector:					#标签选择器
    matchLabels:			#选择包含标签k8s-app: coredns的资源
      k8s-app: coredns
  template:					#镜像模板	
    metadata:				#元数据
      labels:				#标签
        k8s-app: coredns
    spec:					#定义容器模板,该模板可以包含多个容器
      priorityClassName: system-cluster-critical
      serviceAccountName: coredns
      containers: 			#容器信息
      - name: coredns		#容器名称
        image:XXX			#镜像名称:版本号
        args:				#启动容器的命令参数,对应Dockerfile中CMD参数  
        - -conf
        - /etc/coredns/Corefile
        volumeMounts:		#挂载设置
        - name: config-volume 		#挂载设备的名字,与volumes[*].name 需要对应 
          mountPath: /etc/coredns	#挂载到容器的某个路径下
        ports:						#service需要暴露的端口列表
        - containerPort: 53			#容器开发对外的端口
          name: dns					#名称
          protocol: UDP				#端口协议,支持TCP和UDP,默认TCP
        - containerPort: 53
          name: dns-tcp
          protocol: TCP
        - containerPort: 9153
          name: metrics
          protocol: TCP
        livenessProbe:				#pod内容器健康检查的设置
          httpGet:					#通过httpget检查健康,返回200-399之间,则认为容器正常  
            path: /health			#URI地址  
            port: 8080				
            scheme: HTTP
          initialDelaySeconds: 60	#表明第一次检测在容器启动后多长时间后开始  
          timeoutSeconds: 5			#检测的超时时间  
          successThreshold: 1		#探针的成功的阈值,在达到该次数时,表示成功
          failureThreshold: 5		#探针的失败的阈值,在达到该次数时,表示失败
      dnsPolicy: Default			#设置DNS的策略Default(Pod继承所在宿主机的设置,也就是直接将宿主机的/etc/resolv.conf内容挂载到容器中)/ClusterFirst(默认的配置,所有请求会优先在集群所在域查询,如果没有才会转发到上游DNS)/ClusterFirstWithHostNet( 和ClusterFirst一样,不过是Pod运行在hostNetwork:true的情况下强制指定的)/None(1.9版本引入的一个新值,这个配置忽略所有配置,以Pod的dnsConfig字段为准)
      volumes: 						#定义一组挂载设备  
        - name: config-volume		#定义一个挂载设备的名字  
          configMap:				#类型为configMap的存储卷,挂载预定义的configMap对象到容器内部
            name: coredns			#名称
            items:
            - key: Corefile
              path: Corefile


  1. 添加文件:vi cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: coredns
  namespace: kube-system
data:
  Corefile: |
    .:53 {
        errors
        log
        health
        ready
        kubernetes cluster.local 192.168.0.0/16
        forward . 192.168.248.11
        cache 30
        loop
        reload
        loadbalance
       }

apiVersion: v1				#指定api版本,此值必须在kubectl apiversion中  
kind: ConfigMap				#指定创建资源的角色/类型  
metadata:					#资源的元数据/属性  
  name: coredns				#资源的名字,在同一个namespace中必须唯一  
  namespace: kube-system	#资源空间
data:						# zone 的 {} 内每个对象都是一个Plugin ...
  Corefile: |				# Plugins Doc: https://coredns.io/plugins
    .:53 {					#https://coredns.io/manual/toc/#server-blocks
        errors				#对错误信息进行日志记录。
        log					#对DNS查询进行日志记录。
        health				#对Endpoint进行健康检查。
        ready				#在 8181 端口上提供的HTTP,当所有能表达自身就绪的插件都已就绪时会返回 200
        kubernetes cluster.local 192.168.0.0/16		#从Kubernetes中读取zone数据。
        forward . 192.168.248.11	#转发域名查询到上游DNS服务器。
        cache 30			#提供前端缓存功能。
        loop				#检测在DNS解析过程中出现的简单循环问题。
        reload				#定时自动重新加载Corefile配置文件的内容。
        loadbalance			#提供基于DNS的负载均衡功能。
       }
https://blog.csdn.net/qq_31136839/article/details/98177448
https://blog.csdn.net/weixin_45015255/article/details/117236180

--------------------------------------回到192.168.248.21------------------------------------

  1. 启动
kubectl apply -f http://k8s-yaml.zhanzhk.com/coredns/rbac.yaml
kubectl apply -f http://k8s-yaml.zhanzhk.com/coredns/cm.yaml
kubectl apply -f http://k8s-yaml.zhanzhk.com/coredns/dp.yaml
kubectl apply -f http://k8s-yaml.zhanzhk.com/coredns/svc.yaml
  1. 查看: kubectl get all -n kube-system
    在这里插入图片描述
    -------------------------coredns的验证和原理(可忽略)---------------------------
  2. kubectl get all -n kube-system -o wide
    在这里插入图片描述
    19.1. coredns地址已经固定死了:cat /opt/kubernetes/server/bin/kubelet.sh在这里插入图片描述
    19.2 . 验证:dig -t A www.baidu.com @192.168.0.2 +short
    在这里插入图片描述
    19.3. 验证:dig -t A hdss248-21.host.com @192.168.0.2 +short
    在这里插入图片描述
    注:因为我们在cm.yaml里面指定了forward192.168.248.11,我们自建的dns是这个coredns的上一级dns,所以可以查到
  3. 查看kube-public底下是否还有nginx-dp pod,没有的话自建一个并且暴露service
kubectl create deployment nginx-dp --image=harbor.zhanzhk.com/myresposity/nginx:v1.7.9 -n kube-public
kubectl expose deployment nginx-dp --port=80 -n kube-public
  1. kubectl get svc -n kube-public
    在这里插入图片描述
    21.1 验证:dig -t A nginx-dp.kube-public.svc.cluster.local. @192.168.0.2 +short
    在这里插入图片描述
    注:dig -t A nginx-dp.kube-public @192.168.0.2 +short无效
  2. 我们进入一个容器内部试验
    22.1 查看pod:kubectl get pods -o wide
    22.2 进入21的pod:kubectl exec -ti nginx-ds-7r7r5 /bin/bash
    22.3 访问service:curl 192.168.21.96
    22.4 访问service:curl nginx-dp.kube-public.svc.cluster.local
    22.5 访问service:curl nginx-dp.kube-public
    22.6 这里使用短域名之所以可以成功,是因为配置文件里面配置了search,可以在容器里面查看: cat /etc/resolv.conf
    在这里插入图片描述
    注:我们之前直接ping hdss248-21之所以能通也是因为这个原因,可以在宿主机查看:cat /etc/resolv.conf
    在这里插入图片描述

十九、服务暴露之nodePort型service(可忽略)

一、服务暴露分别有以下两种:
1. 使用NodePort型service
	无法使用kube-proxy的ipvs模型,只能使用iptables模型

2. 使用Ingress资源
	Ingress只能调度并暴露7层应用,特指http和https协议

192.168.248.21、192.168.248.22上操作,以192.168.248.21为例:

  1. vi /opt/kubernetes/server/bin/kube-proxy.sh
    1.1 将 --proxy-mode=ipvs 改为 --proxy-mode=iptables
    1.2 将 --ipvs-scheduler=nq 改为 --ipvs-scheduler=rr
  2. 重启kube-proxy
    2.1 查看kube-proxy:supervisorctl status:
    2.2 重启kube-proxy:supervisorctl restart kube-proxy-248-21
    2.3 查看模式:tail -fn 200 /data/logs/kubernetes/kube-proxy/proxy.stdout.log
    在这里插入图片描述
  3. 干掉ipvs: ipvsadm -Ln
 ipvsadm   -D -t  192.168.0.1:443
 ipvsadm   -D -t  192.168.0.2:53
 ipvsadm   -D -t  192.168.0.2:9153
 ipvsadm   -D -t  192.168.21.96:80
 ipvsadm   -D -u  192.168.0.2:53
  1. vi /root/nginx-ds-svc.yaml
    4.1 targetPort: 80 改为 nodePort:8000
    4.2 type: ClusterIP 改为 type: NodePort
    4.3 - port: 8080 改为 - port: 80

  2. 创建service:kubectl apply -f nginx-ds-svc.yaml
    5.1 kubectl get svc -o wide

  3. 在网页访问:192.168.248.21:8000或者192.168.248.22:8000,访问成功。

  4. 还原
    7.1 删除service:kubectl delete svc nginx-ds
    7.2 还原工作模式:还原第一点
    7.3 supervisorctl restart kube-proxy-248-21
    7.4 tail -fn 200 /data/logs/kubernetes/kube-proxy/proxy.stdout.log
    在这里插入图片描述
    7.5 自己发现恢复: ipvsadm -Ln
    在这里插入图片描述

二十、服务暴露之ingress型service

* Ingress是k8s API标准资源类型之一,也是一种核心资源,他其实就是一组基于域名和url地址,
把用户的请求转发至Service资源的规则
* 可以实现集群外部的请求流量转发至集群内部,从而实现服务暴露
* Ingress控制器是能够为Ingress资源监听某套接字,然后根据Ingress规则匹配机制路由调度流量的一个组件。
* Ingress说白了就是简化版nginx+一段go脚本
* 五常用的Ingress控制器:Ingress-nginx 、HAProxy 、Traefix

--------------------------------------在192.168.248.200操作------------------------------------

  1. cd /data/k8s-yaml/ --> mkdir traefik --> cd traefik
  2. 拉取traefik镜像:https://github.com/traefik/traefik/tags
    2.1 docker pull traefik:v1.7.30
    2.2 docker tag add5fac61ae5 harbor.zhanzhk.com/myresposity/traefik:v1.7.30
    2.3 docker push harbor.zhanzhk.com/myresposity/traefik:v1.7.30
  3. 资源配置清单:vi /data/k8s-yaml/traefik/rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: traefik-ingress-controller
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: traefik-ingress-controller
rules:
  - apiGroups:
      - ""
    resources:
      - services
      - endpoints
      - secrets
    verbs:
      - get
      - list
      - watch
  - apiGroups:
      - extensions
    resources:
      - ingresses
    verbs:
      - get
      - list
      - watch
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: traefik-ingress-controller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: traefik-ingress-controller
subjects:
- kind: ServiceAccount
  name: traefik-ingress-controller
  namespace: kube-system

apiVersion: v1						#指定api版本,此值必须在kubectl apiversion中 
kind: ServiceAccount				# 创建服务账户
metadata:							#元数据
  name: traefik-ingress-controller	#服务账户的名字
  namespace: kube-system			#资源空间
---
apiVersion:XX						#指定api版本,此值必须在kubectl apiversion中  
kind: ClusterRole					#集群角色,指定角色权限
metadata:							#元数据
  name: traefik-ingress-controller	#集群角色的名字
rules:
  - apiGroups:						#核心API组
      - ""
    resources:						#操作资源
      - services
      - endpoints
      - secrets
    verbs:							#操作权限
      - get
      - list
      - watch
  - apiGroups:
      - extensions
    resources:
      - ingresses
    verbs:
      - get
      - list
      - watch
---
kind: ClusterRoleBinding			#角色绑定,绑定角色和服务账户
apiVersion: XX						#指定api版本,此值必须在kubectl apiversion中 
metadata:							#元数据
  name: traefik-ingress-controller	#资源的名字
roleRef:							#绑定角色权限
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: traefik-ingress-controller
subjects:							#绑定服务账户
- kind: ServiceAccount
  name: traefik-ingress-controller
  namespace: kube-system


  1. 资源配置清单:vi /data/k8s-yaml/traefik/ds.yaml
apiVersion: extensions/v1beta1
kind: DaemonSet
metadata:
  name: traefik-ingress
  namespace: kube-system
  labels:
    k8s-app: traefik-ingress
spec:
  template:
    metadata:
      labels:
        k8s-app: traefik-ingress
        name: traefik-ingress
    spec:
      serviceAccountName: traefik-ingress-controller
      terminationGracePeriodSeconds: 60
      containers:
      - image: harbor.zhanzhk.com/myresposity/traefik:v1.7.30
        name: traefik-ingress
        ports:
        - name: controller
          containerPort: 80
          hostPort: 81
        - name: admin-web
          containerPort: 8080
        securityContext:
          capabilities:
            drop:
            - ALL
            add:
            - NET_BIND_SERVICE
        args:
        - --api
        - --kubernetes
        - --logLevel=INFO
        - --insecureskipverify=true
        - --kubernetes.endpoint=https://192.168.248.10:7443
        - --accesslog
        - --accesslog.filepath=/var/log/traefik_access.log
        - --traefiklog
        - --traefiklog.filepath=/var/log/traefik.log
        - --metrics.prometheus

对于k8s较新的版本,需要变换脚本命令

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: traefik-ingress
  namespace: kube-system
  labels:
    k8s-app: traefik-ingress
spec:
  selector:
      matchLabels:
          k8s-app: traefik-ingress
  template:
    metadata:
      labels:
        k8s-app: traefik-ingress
        name: traefik-ingress
    spec:
      serviceAccountName: traefik-ingress-controller
      terminationGracePeriodSeconds: 60
      containers:
      - image: harbor.zhanzhk.com/myresposity/traefik:v1.7.30
        name: traefik-ingress
        ports:
        - name: controller
          containerPort: 80
          hostPort: 81
        - name: admin-web
          containerPort: 8080
        securityContext:
          capabilities:
            drop:
            - ALL
            add:
            - NET_BIND_SERVICE
        args:
        - --api
        - --kubernetes
        - --logLevel=INFO
        - --insecureskipverify=true
        - --kubernetes.endpoint=https://192.168.248.10:7443
        - --accesslog
        - --accesslog.filepath=/var/log/traefik_access.log
        - --traefiklog
        - --traefiklog.filepath=/var/log/traefik.log
        - --metrics.prometheus

apiVersion: apps/v1						#指定api版本,此值必须在kubectl apiversion中 
kind: DaemonSet							#指定创建资源的角色/类型  
metadata:								#资源的元数据/属性 
  name: traefik-ingress					#资源的名字,在同一个namespace中必须唯一  
  namespace: kube-system				#资源空间
  labels:								#设定资源的标签
    k8s-app: traefik-ingress
spec:									#设置该资源的内容  
  selector:
      matchLabels:
          k8s-app: traefik-ingress
  template:							#镜像模板	
    metadata:						#元数据
      labels:						#标签
        k8s-app: traefik-ingress
        name: traefik-ingress
    spec:							#定义容器模板,该模板可以包含多个容器
      serviceAccountName: XX		#此处指令为指定sa的名称
      terminationGracePeriodSeconds: 60		#K8S将会给应用发送SIGTERM信号,用来优雅地关闭应用,默认为30秒
      containers:					#容器信息
      - image: XX					#镜像名称:版本号
        name: traefik-ingress		#容器名称
        ports:						#service需要暴露的端口列表
        - name: controller			#名称
          containerPort: 80			#对service暴露端口
          hostPort: 81				#映射到本地的端口
        - name: admin-web			#名称
          containerPort: 8080		#对service暴露端口
        securityContext:			#配置安全上下文securityContext
          capabilities:				#定义权限 https://blog.csdn.net/anqixiang/article/details/108546101
            drop:
            - ALL
            add:
            - NET_BIND_SERVICE
        args:						#容器的启动命令参数列表
        - --api
        - --kubernetes
        - --logLevel=INFO
        - --insecureskipverify=true
        - --kubernetes.endpoint=https://192.168.248.10:7443
        - --accesslog
        - --accesslog.filepath=/var/log/traefik_access.log
        - --traefiklog
        - --traefiklog.filepath=/var/log/traefik.log
        - --metrics.prometheus

  1. 资源配置清单:vi /data/k8s-yaml/traefik/svc.yaml
kind: Service
apiVersion: v1
metadata:
  name: traefik-ingress-service
  namespace: kube-system
spec:
  selector:
    k8s-app: traefik-ingress
  ports:
    - protocol: TCP
      port: 80
      name: controller
    - protocol: TCP
      port: 8080
      name: admin-web

kind: Service
apiVersion: v1
metadata:							#元数据
  name: traefik-ingress-service		#名称
  namespace: kube-system			#命名空间
spec:								#定义Service模板
  selector:							#定义标签选择器
    k8s-app: traefik-ingress
  ports:							#service需要暴露的端口列表
    - protocol: TCP					#端口协议,支持TCP和UDP,默认TCP
      port: 80						#服务监听的端口号
      name: controller				#端口名称
    - protocol: TCP
      port: 8080
      name: admin-web
  1. 资源配置清单:vi /data/k8s-yaml/traefik/ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: traefik-web-ui
  namespace: kube-system
  annotations:
    kubernetes.io/ingress.class: traefik
spec:
  rules:
  - host: traefik.zhanzhk.com
    http:
      paths:
      - path: /
        backend:
          serviceName: traefik-ingress-service
          servicePort: 8080

apiVersion: extensions/v1beta1		
kind: Ingress
metadata:								#元数据
  name: traefik-web-ui					#名称
  namespace: kube-system				#命名空间
  annotations:							#设置自定义注解列表  
    kubernetes.io/ingress.class: traefik
spec:
  rules:								#列表,以下实现对目标地址http://traefik.zhanzhk.com/的访问将被转发到集群中的Service 即traefik-ingress-service:8080上。
  - host: traefik.zhanzhk.com			#被转发的地址
    http:
      paths:
      - path: /							#路径,被转发的地址需要加上该路径
        backend:
          serviceName: traefik-ingress-service		#转发的地址
          servicePort: 8080				#转发的端口

--------------------------------------在192.168.248.21操作------------------------------------

  1. 创建:可以直接kubectl apply 一个远程文件,只要是http协议
kubectl apply -f http://k8s-yaml.zhanzhk.com/traefik/rbac.yaml
kubectl apply -f http://k8s-yaml.zhanzhk.com/traefik/ds.yaml
kubectl apply -f http://k8s-yaml.zhanzhk.com/traefik/svc.yaml
kubectl apply -f http://k8s-yaml.zhanzhk.com/traefik/ingress.yaml
  1. 查看: kubectl get pod -n kube-system
    在这里插入图片描述

  2. 所有的http都要从81进,用Ingress规则分配流量:netstat -luntp |grep 81
    在这里插入图片描述
    -----------------------------在192.168.248.11,192.168.248.12操作-----------------------

  3. 添加nginx配置:vi /etc/nginx/conf.d/zhanzhk.com.conf
    10.1 nginx -t
    10.2 nginx -s reload

-------------------------------------在192.168.248.11操作---------------------------------------

  1. 配置dns解析: vi /var/named/zhanzhk.com.zone
$TTL 600;10minutes
$ORIGIN zhanzhk.com.
@ IN SOA dns.zhanzhk.com. dnsadmin.zhanzhk.com. (
                2021050702; serial
                10800;refresh(3 hours)
                900; retry(15 minutes)
                604800; expire(1 week)
                86400;minimum(1 day)
                )
        NS dns.zhanzhk.com.
$TTL 60;1minute
dns             A       192.168.248.11
harbor          A       192.168.248.200
k8s-yaml        A       192.168.248.200
traefik         A       192.168.248.10
  1. 重启:systemctl restart named
  2. 测试:
    注:之前我是用的是traefik:v1.7.2-alpine,结果导致显示404界面,搞得我一脸懵逼,后来换了个新版本,换成traefik:v1.7.30版本才可以!!真难!

在这里插入图片描述

二十一、dashboard安装部署

192.168.248.200服务器上操作

  1. 下载镜像:docker pull k8scn/kubernetes-dashboard-amd64:v1.8.3
    1.1 改名字:docker tag fcac9aa03fd6 harbor.zhanzhk.com/myresposity/dashboard:v1.8.3
    1.2 推送到自己的仓库:docker push harbor.zhanzhk.com/myresposity/dashboard:v1.8.3
  2. 准备资源配置清单:https://github.com/ --> kubernetes–>kubernetes/kubernetes–>cluster–>addons–>dashboard
  3. mkdir /data/k8s-yaml/dashboard/
  4. vi /data/k8s-yaml/dashboard/rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: kubernetes-dashboard
    addonmanager.kubernetes.io/mode: Reconcile
  name: kubernetes-dashboard-admin
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: kubernetes-dashboard-admin
  namespace: kube-system
  labels:
    k8s-app: kubernetes-dashboard
    addonmanager.kubernetes.io/mode: Reconcile
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: kubernetes-dashboard-admin
  namespace: kube-system

  1. vi /data/k8s-yaml/dashboard/dp.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kubernetes-dashboard
  namespace: kube-system
  labels:
    k8s-app: kubernetes-dashboard
    kubernetes.io/cluster-service: "true"
    addonmanager.kubernetes.io/mode: Reconcile
spec:
  selector:
    matchLabels:
      k8s-app: kubernetes-dashboard
  template:
    metadata:
      labels:
        k8s-app: kubernetes-dashboard
      annotations:
        scheduler.alpha.kubernetes.io/critical-pod: ''
    spec:
      priorityClassName: system-cluster-critical
      containers:
      - name: kubernetes-dashboard
        image: harbor.zhanzhk.com/myresposity/dashboard:v1.8.3
        resources:
          limits:
            cpu: 100m
            memory: 300Mi
          requests:
            cpu: 50m
            memory: 100Mi
        ports:
        - containerPort: 8443
          protocol: TCP
        args:
          # PLATFORM-SPECIFIC ARGS HERE
          - --auto-generate-certificates
        volumeMounts:
        - name: kubernetes-dashboard-certs
          mountPath: /certs
        - name: tmp-volume
          mountPath: /tmp
        livenessProbe:
          httpGet:
            scheme: HTTPS
            path: /
            port: 8443
          initialDelaySeconds: 30
          timeoutSeconds: 30
      volumes:
      - name: kubernetes-dashboard-certs
        secret:
          secretName: kubernetes-dashboard-certs
      - name: tmp-volume
        emptyDir: {}
      serviceAccountName: kubernetes-dashboard-admin
      tolerations:
      - key: "CriticalAddonsOnly"
        operator: "Exists"
      imagePullSecrets:
      - name: harbor


  1. vi /data/k8s-yaml/dashboard/svc.yaml
apiVersion: v1
kind: Service
metadata:
  name: kubernetes-dashboard
  namespace: kube-system
  labels:
    k8s-app: kubernetes-dashboard
    kubernetes.io/cluster-service: "true"
    addonmanager.kubernetes.io/mode: Reconcile
spec:
  selector:
    k8s-app: kubernetes-dashboard
  ports:
  - port: 443
    targetPort: 8443

  1. vi /data/k8s-yaml/dashboard/ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: kubernetes-dashboard
  namespace: kube-system
  annotations:
    kubernetes.io/ingress.class: traefik
spec:
  rules:
  - host: dashboard.zhanzhk.com
    http:
      paths:
      - backend:
          serviceName: kubernetes-dashboard
          servicePort: 443

  1. vi /data/k8s-yaml/dashboard/secret.yaml
apiVersion: v1
kind: Secret
metadata:
  labels:
    k8s-app: kubernetes-dashboard
    # Allows editing resource and makes sure it is created first.
    addonmanager.kubernetes.io/mode: EnsureExists
  name: kubernetes-dashboard-certs
  namespace: kube-system
type: Opaque
---
apiVersion: v1
kind: Secret
metadata:
  labels:
    k8s-app: kubernetes-dashboard
    # Allows editing resource and makes sure it is created first.
    addonmanager.kubernetes.io/mode: EnsureExists
  name: kubernetes-dashboard-key-holder
  namespace: kube-system
type: Opaque

-------------------------------------在192.168.248.22启动dashboard---------------------------------------

  1. 启动
kubectl apply -f http://k8s-yaml.zhanzhk.com/dashboard/rbac.yaml
kubectl apply -f http://k8s-yaml.zhanzhk.com/dashboard/secret.yaml
kubectl apply -f http://k8s-yaml.zhanzhk.com/dashboard/dp.yaml
kubectl apply -f http://k8s-yaml.zhanzhk.com/dashboard/svc.yaml
kubectl apply -f http://k8s-yaml.zhanzhk.com/dashboard/ingress.yaml
  1. kubectl get pod -n kube-system
    在这里插入图片描述
    注:如果启动失败一直处于Pending,则查看是否存在污点:
    11.1 查看:kubectl describe pod XX -n kube-system,查看最后一行
    0/2 nodes are available: 2 node(s) had taint {node.kubernetes.io/unreachable: }, that the pod didnt'
    11.2 去除污点:kubectl taint nodes --all node.kubernetes.io/unreachable-
    11.3 重新查看启动情況,如果重启电脑吧、、我重启完就正常了。

--------------------------------在192.168.248.11添加dashboarddns----------------------------------
12. vi /var/named/zhanzhk.com.zone

$TTL 600;10minutes
$ORIGIN zhanzhk.com.
@ IN SOA dns.zhanzhk.com. dnsadmin.zhanzhk.com. (
                2021050702; serial
                10800;refresh(3 hours)
                900; retry(15 minutes)
                604800; expire(1 week)
                86400;minimum(1 day)
                )
        NS dns.zhanzhk.com.
$TTL 60;1minute
dns             A       192.168.248.11
harbor          A       192.168.248.200
k8s-yaml        A       192.168.248.200
traefik         A       192.168.248.10
dashboard       A       192.168.248.10
  1. 更新:systemctl restart named
  2. 验证:dig -t A dashboard.zhanzhk.com @192.168.248.11 +short
  3. 验证(192.168.248.21):dig -t A dashboard.zhanzhk.com @192.168.0.2 +short也能成功,因为192.168.0.2的上级dns就是192.168.248.11上的dns
  4. 访问:dashboard.zhanzhk.com

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
登录无效,因为不安全,所以需要生成证书。

  1. 注,以下操作可忽略
    因为dashboard1.8.1根据网友反馈估计是版本较低,而且本人使用确实出现一些模块404的情况,所以做个升级,打算使用dashboard:v2.1.0。由于该部分是博客结束后才重新升级的,所以后面的界面介绍以dashboard1.8.1为主,且不影响k8s功能使用,仅影响dashboard面板一些模块的访问。
    16.1 下载:docker pull kubernetesui/dashboard:v2.1.0
    16.2 打标签并推送到harbor仓库:harbor.zhanzhk.com/myresposity/dashboard:v2.1.0
    16.3 修改dp.yaml,镜像改为 harbor.zhanzhk.com/myresposity/dashboard:v2.1.0
    在这里插入图片描述
    16.4 修改rbac-minimal.yaml,修改这句:resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs", "kubernetes-dashboard-csrf"]
    在这里插入图片描述
    16.5 修改secret.yaml,在末尾加上这段
---
apiVersion: v1
kind: Secret
metadata:
  labels:
    k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard-csrf
  namespace: kube-system
type: Opaque
data:
  csrf: ""
  1. 重新apply这三个文件:rbac-minimal.yamlsecret.yamldp.yaml
    进入后的页面
    在这里插入图片描述

二十二、RBAC相关介绍(可忽略)

  1. k8s自1.6版本起默认使用基于角色的访问控制(RBAC:role-based-Access-control ) 基于角色的访问控制是相对于基于属性的访问控制(ABAC:Attribute-based-access-control )来说的。
    k8s在RBAC这种机制下无法直接给账户赋予权限,只能通过中间的角色。即账户赋予角色,角色赋予权限。

  2. k8s集群里的权限,如:读-get,写-write,更新-update,列出-list,监视-watch…等等

  3. k8s集群里有两种账户
    3.1 用户账户:user account(UA),一般针对于我们的二进制部署,才需要用到用户账户,即不在k8s集群内。如我们的kubeletcat /opt/kubernetes/server/bin/conf/kubelet.kubeconfig
    在这里插入图片描述

    3.2 服务账户:service account(SA),k8s的所有pod都必须有一个服务账户,如果不指定,则默认为default。
    在这里插入图片描述

  4. k8s集群里有两种角色
    4.1 Role:普通角色,只能应用在某一个特定的名称空间下,比如在kube-system创建了角色并且指定-n 为kube-system,则该角色只能在kube-system底下使用。
    4.2 ClusterRole:集群角色,对整个集群有效

  5. 账户绑定角色的两种操作,也被抽象成了资源,所以有相对于的yaml文件
    5.1 RoleBinding
    5.2 ClusterRoleBinding

  6. k8s集群立有一些自带的角色,如我们创建的dashboard的Rbac.yaml里面的角色–>cluster-admin,就是k8s自带的角色。查看::kubectl get clusterrole
    在这里插入图片描述

  7. 查看cluster-admin(集群管理员)角色:kubectl get clusterrole cluster-admin -o yaml
    在这里插入图片描述

  8. 再回头看看之前的yaml配置文件,思路就比较清楚了。

二十三、dashboard鉴权

192.168.248.200服务器操作

  1. cd /opt/certs/

  2. 创建dashboard.zhanzhk.com的私钥,加密算法用2048位:(umask 077;openssl genrsa -out dashboard.zhanzhk.com.key 2048)

  3. 生成证书签发的请求文件:openssl req -new -key dashboard.zhanzhk.com.key -out dashboard.zhanzhk.com.csr -subj "/CN=dashboard.zhanzhk.com/C=CN/ST=BJ/L=Beijing/O=zhanzhkEdu/OU=ops"

  4. 生成证书:openssl x509 -req -in dashboard.zhanzhk.com.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out dashboard.zhanzhk.com.crt -days 3650

  5. 查看证书信息:cfssl-certinfo -cert dashboard.zhanzhk.com.crt
    在这里插入图片描述
    --------------------------------在192.168.248.11添加证书----------------------------------

  6. 创建文件夹:mkdir /etc/nginx/certs

  7. 进入并将证书拷贝到该目录:cd /etc/nginx/certs
    dashboard.zhanzhk.com.crtdashboard.zhanzhk.com.key

  8. vi /etc/nginx/conf.d/dashboard.zhanzhk.com.conf

server {
    listen       80;
    server_name  dashboard.zhanzhk.com;

    rewrite ^(.*)$ https://${server_name}$1 permanent;
}
server {
    listen       443 ssl;
    server_name  dashboard.zhanzhk.com;

    ssl_certificate "certs/dashboard.zhanzhk.com.crt";
    ssl_certificate_key "certs/dashboard.zhanzhk.com.key";
    ssl_session_cache shared:SSL:1m;
    ssl_session_timeout  10m;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass http://default_backend_traefik;
	      proxy_set_header Host       $http_host;
        proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
    }
}

  1. nginx -t —> nginx -s reload

  2. 然后再次访问:dashboard.zhanzhk.com/
    点击高级 -->继续前往
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    --------------------------------切回192.168.248.21----------------------------------

  3. 查看私钥: kubectl get secret -n kube-system

  4. 查看私钥具体信息:kubectl describe secret kubernetes-dashboard-admin-token-7666z -n kube-system
    在这里插入图片描述

  5. 登录
    在这里插入图片描述
    在这里插入图片描述
    登录成功!

  6. 替换dashboard镜像为较新版本的,先删除资源:kubectl delete -f http://k8s-yaml.zhanzhk.com/dashboard/dp.yaml
    --------------------------------切回192.168.248.200----------------------------------

14.下载新版本:docker pull hexun/kubernetes-dashboard-amd64:v1.10.1
15. 改名: docker tag f9aed6605b81 harbor.zhanzhk.com/myresposity/dashboard:v1.10.1
16. 推送到仓库docker push harbor.zhanzhk.com/myresposity/dashboard:v1.10.1
17. 修改dashboad的dp.yaml:vi /data/k8s-yaml/dashboard/dp.yaml,将镜像版本改为v1.10.1

在这里插入图片描述
--------------------------------切回192.168.248.21----------------------------------

  1. 更新资源:kubectl apply -f http://k8s-yaml.zhanzhk.com/dashboard/dp.yaml
  2. 查看:kubectl get pod -n kube-system
    在这里插入图片描述
  3. 重新访问dashboard.zhanzhk.com/发现不能跳过了,需要输入令牌。输入前面获取的token,即可登录。
    在这里插入图片描述
    在这里插入图片描述

二十四、dashboard分权举例

192.168.248.200服务器操作

  1. vi /data/k8s-yaml/dashboard/rbac-minimal.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  labels:
    k8s-app: kubernetes-dashboard
    addonmanager.kubernetes.io/mode: Reconcile
  name: kubernetes-dashboard
  namespace: kube-system
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  labels:
    k8s-app: kubernetes-dashboard
    addonmanager.kubernetes.io/mode: Reconcile
  name: kubernetes-dashboard-minimal
  namespace: kube-system
rules:
  # Allow Dashboard to get, update and delete Dashboard exclusive secrets.
- apiGroups: [""]
  resources: ["secrets"]
  resourceNames: ["kubernetes-dashboard-key-holder", "kubernetes-dashboard-certs"]
  verbs: ["get", "update", "delete"]
  # Allow Dashboard to get and update 'kubernetes-dashboard-settings' config map.
- apiGroups: [""]
  resources: ["configmaps"]
  resourceNames: ["kubernetes-dashboard-settings"]
  verbs: ["get", "update"]
  # Allow Dashboard to get metrics from heapster.
- apiGroups: [""]
  resources: ["services"]
  resourceNames: ["heapster"]
  verbs: ["proxy"]
- apiGroups: [""]
  resources: ["services/proxy"]
  resourceNames: ["heapster", "http:heapster:", "https:heapster:"]
  verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: kubernetes-dashboard-minimal
  namespace: kube-system
  labels:
    k8s-app: kubernetes-dashboard
    addonmanager.kubernetes.io/mode: Reconcile
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: kubernetes-dashboard-minimal
subjects:
- kind: ServiceAccount
  name: kubernetes-dashboard
  namespace: kube-system

  1. 修改dp.yamlserviceAccountNamekubernetes-dashboard (最小化权限的用户) :vi /data/k8s-yaml/dashboard/dp.yaml
    在这里插入图片描述

--------------------------------切回192.168.248.21----------------------------------

  1. 创建资源:kubectl apply -f http://k8s-yaml.zhanzhk.com/dashboard/rbac-minimal.yaml
  2. 更新资源:kubectl apply -f http://k8s-yaml.zhanzhk.com/dashboard/dp.yaml
  3. 查看secret并且获取token
    在这里插入图片描述
  4. 用这个token登录,可以看到基本没什么权限
    在这里插入图片描述
    7.然后将权限改回来( serviceAccountName: kubernetes-dashboard-admin),重启更新(第二点、第四点)

二十五、dashboard插件之heapster(可忽略)

注:heapster插件在k8s1.12以后就废弃了。我最终的成品,并没有出现理想的效果图。个人盲猜是因为我的k8s版本较高,是Kubernetes v1.18.19,所以导致效果图没出来,后面的最终效果图是视频截取。如果你们安装的k8s版本较低,可以尝试,不然可以直接忽略。
192.168.248.200服务器操作

  1. 创建文件夹:mkdir /data/k8s-yaml/dashboard/heapster
  2. 进入目录:cd /data/k8s-yaml/dashboard/heapster
  3. 拉取镜像:docker pull quay.io/bitnami/heapster:1.5.4
  4. 修改:docker tag c359b95ad38b harbor.zhanzhk.com/myresposity/heapster:v1.5.4
  5. 推送到私有仓库:docker push harbor.zhanzhk.com/myresposity/heapster:v1.5.4
  6. vi /data/k8s-yaml/dashboard/heapster/rbac.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: heapster
  namespace: kube-system
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: heapster
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: system:heapster
subjects:
- kind: ServiceAccount
  name: heapster
  namespace: kube-system

  1. vi /data/k8s-yaml/dashboard/heapster/dp.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: heapster
  namespace: kube-system
  labels:
    k8s-app: heapster
spec:
  selector:
    matchLabels:
      k8s-app: heapster
  template:
    metadata:
      labels:
        task: monitoring
        k8s-app: heapster
    spec:
      serviceAccountName: heapster
      containers:
      - name: heapster
        image: harbor.zhanzhk.com/myresposity/heapster:v1.5.4
        imagePullPolicy: IfNotPresent
        command:
        - /opt/bitnami/heapster/bin/heapster
        - --source=kubernetes:https://kubernetes.default
  1. vi /data/k8s-yaml/dashboard/heapster/svc.yaml
apiVersion: v1
kind: Service
metadata:
  labels:
    task: monitoring
    # For use as a Cluster add-on (https://github.com/kubernetes/kubernetes/tree/master/cluster/addons)
    # If you are NOT using this as an addon, you should comment out this line.
    kubernetes.io/cluster-service: 'true'
    kubernetes.io/name: Heapster
  name: heapster
  namespace: kube-system
spec:
  ports:
  - port: 80
    targetPort: 8082
  selector:
    k8s-app: heapster

--------------------------------切回192.168.248.21----------------------------------

  1. 启动资源
kubectl apply -f http://k8s-yaml.zhanzhk.com/dashboard/heapster/rbac.yaml
kubectl apply -f http://k8s-yaml.zhanzhk.com/dashboard/heapster/dp.yaml
kubectl apply -f http://k8s-yaml.zhanzhk.com/dashboard/heapster/svc.yaml
  1. 效果
    启动前
    在这里插入图片描述
    启动后
    在这里插入图片描述

二十六、k8s集群平滑升级(可忽略)

192.168.248.21服务器操作,将Kubernetes v1.18.19升级成Kubernetes v1.18.20
注:升级条件:流量低谷。集群流量关掉,node节点删掉,准备好升级包,软链接准备好,配置完,挨个重启。再开启集群流量。

  1. 查看pod分布: kubectl get pod -n kube-system -o wide,可以看出21上的节点较少
    在这里插入图片描述

  2. 删除node节点:kubectl delete node hdss248-21.host.com

  3. 查看:kubectl get node
    在这里插入图片描述

  4. 查看pod分布: kubectl get pod -n kube-system -o wide,可以看到都移到22上面去了
    注:我们删除node,k8s会自动将pod迁移到其他node上面去,这就是容器编排的优点。
    在这里插入图片描述

  5. 检验:dig -t A kubernetes.default.svc.cluster.local @192.168.0.2 +short,发现coredns正常不受影响
    在这里插入图片描述
    --------------------------------切回192.168.248.11----------------------------------

  6. 注释掉四层跟七层的负载均衡

vi /etc/nginx/nginx.conf

stream {
    upstream kube-apiserver {
    #    server 192.168.248.21:6443     max_fails=3 fail_timeout=30s;
        server 192.168.248.22:6443     max_fails=3 fail_timeout=30s;
    }
    server {
        listen 7443;
        proxy_connect_timeout 2s;
        proxy_timeout 900s;
        proxy_pass kube-apiserver;
    }

vi /etc/nginx/conf.d/zhanzhk.com.conf

upstream default_backend_traefik {
  #  server 192.168.248.21:81    max_fails=3 fail_timeout=10s;
    server 192.168.248.22:81    max_fails=3 fail_timeout=10s;
}
server {
    server_name *.zhanzhk.com;
  
    location / {
        proxy_pass http://default_backend_traefik;
        proxy_set_header Host       $http_host;
        proxy_set_header x-forwarded-for $proxy_add_x_forwarded_for;
    }
} 

--------------------------------切回192.168.248.21----------------------------------

  1. 下载kubernetes v1.18.20版本,我们升级一个小版本。
    注:下载地址https://github.com/kubernetes/kubernetes/releases/tag/v1.18.20
  2. 将下载的kubernetes v1.18.20安装包放在/opt/src目录下
    注:不同版本的安装包不知道为啥名称一样,所以如果原先的安装包需要备份,就先备份下,避免被覆盖。
    8.1 解压到opt目录下 : tar xf kubernetes-server-linux-amd64.tar.gz -C /opt/
    8.2 改名称: mv kubernetes kubernetes-v1.18.20
    8.3 软连接: rm -fr /opt/kubernetes --> ln -s /opt/kubernetes-v1.18.20 /opt/kubernetes
    8.4 删除源码包:cd kubernetes —> rm -fr kubernetes-src.tar.gz
    8.5 删除镜像包: cd server/bin —> rm -f *.tar —> rm -f *_tag
  3. 将v1.18.19版本里的conf底下的文件拷贝过来
mkdir conf
cd /opt/kubernetes-v1.18.20/server/bin/conf
cp /opt/kubernetes-v1.18.19/server/bin/conf/* .
  1. 将v1.18.19版本里的cert底下的文件拷贝过来
mkdir conf
cd /opt/kubernetes-v1.18.20/server/bin/conf
cp /opt/kubernetes-v1.18.19/server/bin/conf/* .
  1. 将v1.18.19版本里的.sh文件都拷贝过来
cd /opt/kubernetes-v1.18.20/server/bin
cp /opt/kubernetes-v1.18.19/server/bin/*.sh .
  1. 重启:supervisorctl restart all(生产环境需要一个一个来)

  2. 查看启动情况:supervisorctl status
    在这里插入图片描述
    13.1 如果出现启动没成功的情况,我们手动启动:supervisorctl start etcd-server-248-21 ,其他几个同上
    在这里插入图片描述
    13.2 如果还是启动失败,则查看进行,在杀掉对应的进程,重新启动即可!
    在这里插入图片描述
    在这里插入图片描述

  3. 查看node: kubectl get node -o wide,升级成功在这里插入图片描述

  4. 为了保证节点版本一致,我们这里换回来版本
    15.1 重新指定软连接:rm -fr /opt/kubernetes --> ln -s /opt/kubernetes-v1.18.19 /opt/kubernetes
    15.2 重启:supervisorctl restart all,出现问题找第13点
    15.3 查看:supervisorctl status

  5. 查看: kubectl get node -o wide
    在这里插入图片描述

  6. kubectl label node hdss248-21.host.com node-role.kubernetes.io/master=

  7. kubectl label node hdss248-21.host.com node-role.kubernetes.io/node=
    --------------------------------切回192.168.248.11----------------------------------

  8. 打开流量,将第六点的注释放开:vi /etc/nginx/nginx.conf --> vi /etc/nginx/conf.d/zhanzhk.com.conf
    16.1 nginx -t —> nginx -s reload

    --------------------------------切回192.168.248.12----------------------------------

  9. 我们在12的nginx上面也配置下dashboard
    18.1 cd /etc/nginx/conf.d
    18.2 将 /etc/nginx/conf.d下的dashboard.zhanzhk.com.conf文件搬过来
    18.3 cd /etc/nginx --> mkdir certs
    18.4 将/etc/nginx/certs底下的两个证书拷过来
    18.4 nginx -t —> nginx -s reload

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值