系统:Windows10 专业版
安装虚拟机软件VMware
Workstation 16 Pro for Windows: https://www.vmware.com/go/getworkstation-win
序列号:ZF3R0-FHED2-M80TY-8QYGC-NPKYF
创建准备Linux虚拟机环境
下载系统镜像
Centos7:
http://mirrors.ustc.edu.cn/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-Minimal-2009.iso
Ubuntu20:
https://releases.ubuntu.com/20.04/ubuntu-20.04.2-live-server-amd64.iso
创建虚拟机
制作模板机
修改软件镜像源地址
安装基础软件工具包(net-tools、vim、git等)
安装容器运行时docker
根据模板机克隆至少5个虚拟机
- 运维管理节点
- Maser主节点
- DNS节点
- 计算节点1
- 计算节点2
网络规划和配置
虚拟机网络(服务器网络)
网段:10.4.7.X/24
子网掩码:255.255.255.0
网关:10.4.7.254
DNS服务器1:10.4.7.254
服务器1(主节点Master)
IP地址:10.4.7.200
服务器2(管理运维节点Manager)
IP地址:10.4.7.100
服务器3(DNS节点)
IP地址:10.4.7.11
服务器4(计算节点1)
IP地址:10.4.7.22
服务器5(计算节点2)
IP地址:10.4.7.33
手动配置静态IP地址
1 | vim /etc/sysconfig/network-scripts/ifcfg-ens33 |
查看地址信息
1 | [root@centos7demo ~]# ip addr |
测试ping网络地址
1 | [root@centos7demo ~]# ping www.baidu.com |
系统配置
更改主机名
1 | [root@centos7demo ~] |
K8s官方安装解决方案:
https://kubernetes.io/zh/docs/setup/production-environment/container-runtimes/#docker
关闭防火墙 firewalld
查看centos防火墙状态
1 | [root@centos7demo ~]# systemctl status firewalld |
关闭防火墙
1 | [root@centos7demo ~]# systemctl stop firewalld |
避免开机启动
1 | [root@centos7demo ~]# systemctl disable firewalld |
关于SELinux
SELinux 有三个模式(可以由用户设置)。这些模式将规定 SELinux 在主体请求时如何应对。
这些模式是:
Enforcing 强制— SELinux 策略强制执行,基于 SELinux 策略规则授予或拒绝主体对目标的访问
Permissive 宽容— SELinux 策略不强制执行,不实际拒绝访问,但会有拒绝信息写入日志
Disabled 禁用— 完全禁用SELinux
默认情况下,大部分系统的SELinux设置为Enforcing。
查看系统当前是什么模式?
1 | [root@centos7demo ~]# getenforce |
关闭SELinux
1 | [root@centos7demo ~]# vim /etc/selinux/config |
重启机器后
1 | [root@centos7demo ~]# sestatus -v |
Linux Swap
swap space是磁盘上的一块区域,可以是一个分区,也可以是一个文件,或者是他们的组合。简单点说,当系统物理内存吃紧时,Linux会将内存中不常访问的数据保存到swap上,这样系统就有更多的物理内存为各个进程服务,而当系统需要访问swap上存储的内容时,再将swap上的数据加载到内存中,这就是我们常说的swap out和swap in。
很多发行版(如ubuntu)的休眠功能依赖于swap分区,当系统休眠的时候,会将内存中的数据保存到swap分区上,等下次系统启动的时候,再将数据加载到内存中,这样可以加快系统的启动速度,所以如果要使用休眠的功能,必须要配置swap分区,并且大小一定要大于等于物理内存。
关闭SWAP
1 | [root@centos7demo ~]# swapoff |
禁用 /proc/swaps 中的所有交换区
1 | [root@centos7demo ~]# swapoff -a |
注释掉 swap 相关配置
1 | [root@centos7demo ~]# vim /etc/fstab |
确保成功 列表为空
1 | [root@centos7demo ~]# cat /proc/swaps |
安装容器运行时(Docker)
更新yum软件包
1 | [root@centos7demo ~]# yum -y update && yum -y upgrade |
安装基础依赖
yum网络不通,导致安装软件包失败
1 | Downloading packages: |
解决:添加DNS
1 | [root@centos7demo yum.repos.d]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 |
1 | [root@centos7demo yum.repos.d]# systemctl restart network |
安装基础包(虚拟磁盘管理工具)
1 | [root@centos7demo yum.repos.d]# yum install yum-utils device-mapper-persistent-data lvm2 |
添加 Docker yum阿里云仓库
1 | [root@centos7demo ~]# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo |
安装docker-ce
1 | [root@centos7demo ~]# yum update && yum install docker-ce |
配置Docker daemon
1 | [root@centos7demo ~]# mkdir /etc/docker |
重载配置和重启docker设置开机启动
1 | [root@centos7demo docker]# systemctl daemon-reload |
克隆系统镜像
以上述过程准备好的虚拟机环境为模板,创建三个虚拟机:master-7.200、node-7.22、node-7.33
分别修改主机名称:master-200、manager-100、dns-11、node-22、node-33
1 | vim /etc/hostname |
修改网络静态IP地址分配为:10.4.7.200、10.4.7.100、10.4.7.11、10.4.7.22、10.4.7.33
1 | vim /etc/sysconfig/network-scripts/ifcfg-ens33 |
DNS节点安装bind服务
bind:https://www.isc.org/bind/
现在使用最为广泛的DNS服务器软件是BIND(Berkeley Internet Name Domain),最早有伯克利大学的一名学生编写,现在最新的版本是9,有ISC(Internet Systems Consortium)编写和维护。
BIND支持先今绝大多数的操作系统(Linux,UNIX,Mac,Windows)
BIND服务的名称称之为named
DNS默认使用UDP、TCP协议,使用端口为53(domain),953(mdc,远程控制使用)
1 | yum install -y bind bind-chroot bind-utils |
修改主配置
1 | [root@node-11 ~]# vim /etc/named.conf |
检查配置
1 | [root@node-11 ~]# named-checkconf |
区域配置文件
1 | [root@node-11 ~]# vim /etc/named.rfc1912.zones |
编辑区域数据文件
主机域
1 | [root@node-11 ~]# vim /var/named/host.com.zone |
1 | [root@node-11 ~]# vim /var/named/zrf.com.zone |
1 | [root@node-11 ~]# named-checkconf |
启动DNS服务
1 | [root@node-11 ~]# systemctl start named |
查看进程 监听了 53 端口
1 | [root@node-11 ~]# netstat -nltp |
测试dns
Dig是一个在类Unix命令行模式下查询DNS包括NS记录,A记录,MX记录等相关信息的工具。
1 | [root@node-11 ~]# dig -t A node7-22.host.com @10.4.7.11 +short |
修改每个主机的DNS1配置为:10.4.7.11
1 | [root@master-200 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33 |
配置宿主机(Windows的网络设置)虚拟机网卡(VMware Network Adapter VMnet8)的首选DNS为:10.4.7.11
然后本地 ping 自建域名
1 | C:\Users\darifo>ping node7-100.host.com |
证书签发
安装在 运维管理主机(10.4.7.100)上
安装 CFSSL R1.2
1 | wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 |
赋予执行权限
1 | chmod -x cfssl* |
重命名
1 | for x in cfssl*; do mv $x ${x%*_linux-amd64}; done |
移动文件到目录 (/usr/bin)
1 | [root@node-100 ~]# mv cfssl* /usr/bin |
赋执行权限
1 | [root@node-100 ~]# chmod +x /usr/bin/cfssl* |
准备证书目录
1 | [root@node-100 ~]# cd /opt |
创建CA证书
1 | [root@node-100 certs]# vim ca-csr.json |
生成文件
1 | [root@node-100 certs]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca |
安装Harbor
https://github.com/goharbor/harbor/releases
1 | [root@node-100 src]# wget https://github.com/goharbor/harbor/releases/download/v2.1.5/harbor-offline-installer-v2.1.5.tgz |
配置 harbor.yml 并创建相关目录
1 | [root@node-100 harbor]# vim harbor.yml |
安装docker-compose
https://github.com/docker/compose/releases/
1 | [root@node-100 src]# mv docker-compose-Linux-x86_64 docker-compose |
执行安装脚本
1 | [root@node-100 harbor]# ./install.sh |
启动 Harbor
1 | [root@node-100 harbor]# docker-compose up -d |
安装 Nginx
1 | [root@node-100 harbor]# cd /etc/yum.repos.d/ |
配置Nginx代理
1 | [root@node-100 ~]# vim /etc/nginx/conf.d/harbor.zrf.com.conf |
配置DNS服务器解析 (10.4.7.11上)
1 | [root@node-11 ~]# vim /var/named/zrf.com.zone |
浏览器访问:
管理节点(10.4.7.100)上配置docker的 registry-mirrors (镜像加速地址)和 insecure-registries(私有仓库地址)
1 | [root@node-100 ~]# vim /etc/docker/daemon.json |
查看Docker的桥接网卡
1 | [root@node-100 harbor]# docker network inspect bridge |
测试镜像推送
1 | [root@node-100 ~]# docker pull nginx:1.20 |
安装 K8s
在管理节点(10.4.7.100)上
创建根证书配置文件
vim /opt/certs/ca-config.json
1 |
|
创建根证书请求文件 etcd-peer-csr.json
vim /opt/certs/etcd-peer-csr.json
1 | { |
生成etcd用的证书文件
1 |
|
master节点(10.4.7.200)安装etcd
主节点(10.4.7.200)
创建用户
1 | [root@master-200 ~]# useradd -s /sbin/nologin -M etcd |
下载软件
https://github.com/etcd-io/etcd/releases
1 | [root@master-200 ~]# wget https://github.com/etcd-io/etcd/releases/download/v3.4.16/etcd-v3.4.16-linux-amd64.tar.gz |
创建数据目录
1 | [root@master-200 etcd]# mkdir -p /opt/etcd/certs /data/etcd /data/logs/etcd-server |
授权用户目录权限
1 | [root@master-200 etcd]# chown -R etcd.etcd /opt/etcd-v3.4.16/ |
拷贝证书从管理节点(10.4.7.100)到主节点(10.4.7.200)
1 | [root@master-200 etcd]# cd /opt/certs |
配置etcd启动脚本
1 | [root@master-200 etcd]# vim etcd-server-startup.sh |
1 | [root@master-200 etcd]# chmod +x etcd-server-startup.sh |
安装 supervisor 软件
1 | [root@master-200 etcd]# yum install epel-release |
配置 supervisor 的 etcd-server.ini
1 | [root@master-200 etcd]# vim /etc/supervisord.d/etcd-server.ini |
更新和启动
1 | [root@master-200 etcd]# supervisorctl update |
计算节点1(10.4.7.22)安装etcd
基础批处理命令
1 | !/bin/sh |
编辑启动脚本
1 | cd /opt/etcd |
1 | 配置etcd-server的进程守护 |
1 | 更新重载查看 supervisor |
计算节点2(10.4.7.33)安装etcd
基础操作同上
区别安装
1 | vim etcd-server-startup.sh |
1 | 配置etcd-server的进程守护 |
下载安装 kubernetes
https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG
https://dl.k8s.io/v1.21.1/kubernetes-server-linux-amd64.tar.gz
本机下载后上传到 7-100,然后远程拷贝到计算节点
计算节点1(10.4.7.22)安装k8s
1 | [root@master-22 opt]# scp node7-100.host.com:/opt/src/kubernetes-server-linux-amd64.tar.gz . |
1 | [root@master-22 opt]# tar xfv kubernetes-server-linux-amd64.tar.gz -C /opt |
终于启动了etcd集群
1 | [root@node-33 etcd]# kubectl get cs |
计算节点1(10.4.7.33)安装k8s
1 | [root@node-33 opt]# scp node7-100.host.com:/opt/src/kubernetes-server-linux-amd64.tar.gz . |
其余操作同上。
签发k8s证书
在管理运维机器节点(10.4.7.100)上
client证书配置
1 | [root@node-100 certs]# vim client-csr.json |
1 | { |
签发 Client 证书
1 | [root@node-100 certs]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client client-csr.json | cfssljson -bare client |
api-server证书配置
1 | [root@node-100 certs]# vim apiserver-csr.json |
1 | { |
api-server证书生成
1 | [root@node-100 certs]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server apiserver-csr.json | cfssljson -bare apiserver |
将证书拷贝到各个计算节点
1 |
|
创建 apiserver启动配置文件
1 | [root@node-22 bin]# mkdir conf |
audit.yaml
1 | apiVersion: audit.k8s.io/v1beta1 # This is required. |
副本
1 | apiVersion: audit.k8s.io/v1beta1 |
kube-apiserver 启动脚本
1 | /opt/kubernetes/server/bin |
配置supervisor守护
1 | [root@node-22 bin]# vim /etc/supervisord.d/kube-apiserver.ini |
kube-apiserver.ini
1 | [program:kube-apiserver-7-22] |
创建日志目录
1 | [root@node-22 bin]# mkdir -p /data/logs/kubernetes/kube-apiserver |
1 | [root@node-22 bin]# supervisorctl update |
注:新版本的kube-apiserv 已经强制关闭了监听 http的 8080 端口,只能提供基于SSL的6443端口服务,我降版本重新安装了 v-1.19.11就可以配置 –insecure-port 8080 了。
安装部署主控节点L4反代
在 10.4.7.200 ( master) 和 10 .4.7.11(dns) 上安装 nginx(详见上文:安装nginx)
安装配置nginx
1 | [root@master-200 yum.repos.d]# vim /etc/nginx/nginx.conf |
统一配置
1 | stream { |
1 | [root@node-11 yum.repos.d]# systemctl start nginx |
安装配置 keepalive
1 | [root@node-11 yum.repos.d]# yum install keepalived -y |
1 | [root@node-11 yum.repos.d]# vim /etc/keepalived/check_port.sh |
#!/bin/bash
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 | [root@node-11 keepalived]# vim /etc/keepalived/keepalived.conf |
10.4.7.11上的keepalived配置
global_defs {
router_id 10.4.7.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 10.4.7.11
nopreempt
authentication {
auth_type PASS
auth_pass 11111111
}
track_script {
chk_nginx
}
virtual_ipaddress {
10.4.7.110
}
}
10.4.7.200上的keepalived配置
global_defs {
router_id 10.4.7.200
}
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
priority 90
advert_int 1
mcast_src_ip 10.4.7.200
authentication {
auth_type PASS
auth_pass 11111111
}
track_script {
chk_nginx
}
virtual_ipaddress {
10.4.7.110
}
}
安装 kube-controller-manager和kube-scheduler
controller启动脚本配置
1 | vim kube-controller-manager.sh |
scheduler启动脚本
1 | vim /opt/kubernetes/server/bin/kube-scheduler.sh |
1 | vim /etc/supervisord.d/kube-scheduler.ini |
supervisor更新启动
1 | supervisor update |
建立快速命令链接
1 | ln -s /opt/kubernetes/server/bin/kubectl /usr/bin/kubectl |
查看集群健康状态
1 | kubectl get cs |
计算节点安装kubelet
证书签发
1 | [root@node-100 certs]# vim kubelet-csr.json |
拷贝证书到计算节点
1 | cd /opt/kubernetes/server/bin/cert |
分发配置证书
1 | cd /opt/kubernetes/server/bin/conf/ |
1 | kubectl config set-cluster darifo-k8s \ |
集群角色绑定和权限授予
计算节点 10.4.7.22 和 10.4.7.33 上:
k8s-node.yaml
1 | /opt/kubernetes/server/bin/conf |
1 | apiVersion: rbac.authorization.k8s.io/v1 |
只需要在一个计算节点执行
1 | kubectl create -f k8s-node.yaml |
准备pause基础镜像
在管理运维节点 10.4.7.100上
1 |
|
kubelet启动脚本
在计算节点上: /opt/kubernetes/server/bin
[root@node-22 bin]# vim kubelet.sh
1 | !/bin/sh |
[root@node-33 bin]# vim kubelet.sh
1 | !/bin/sh |
1 | mkdir -p /data/logs/kubernetes/kube-kubelet /data/kubelet |
1 | [root@node-22 bin]# vim /etc/supervisord.d/kube-kubelet.ini |
1 | [root@node-33 bin]# vim /etc/supervisord.d/kube-kubelet.ini |
1 | supervisorctl update |
1 | [root@node-22 bin]# supervisorctl status |
节点角色添加标签
1 | 给节点 node7-22.host.com 添加一个master标签 |
计算节点安装kube-proxy
签发证书
1 | [root@node-100 certs]# vim kube-proxy-csr.json |
1 | [root@node-100 certs]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client kube-proxy-csr.json |cfssljson -bare kube-proxy-client |
分发证书
在计算节点: /opt/kubernetes/server/bin/cert
1 | scp node7-100.host.com:/opt/certs/kube-proxy-client.pem . |
创建配置
在 节点 22 上:
/opt/kubernetes/server/bin/conf 目录内执行
1 | kubectl config set-cluster darifo-k8s \ |
1 | kubectl config set-credentials kube-proxy \ |
1 | kubectl config set-context darifo-k8s-context \ |
1 | kubectl config use-context darifo-k8s-context --kubeconfig=kube-proxy.kubeconfig |
拷贝到 33 节点
/opt/kubernetes/server/bin/conf
1 | [root@node-33 cert]# scp node7-22.host.com:/opt/kubernetes/server/bin/conf/kube-proxy.kubeconfig . |
安装配置IPVS
1 | vi /root/ipvs.sh |
查看ipvs模块
1 | [root@node-22 ~]# lsmod | grep ip_vs |
创建kube-proxy启动脚本
计算节点都需要操作
1 | kube-proxy.sh |
1 | vim /etc/supervisord.d/kube-proxy.ini |
1 | supervisorctl update |
创建 nginx pod 验证集群
1 | [root@node-22 ~]# vim nginx-test.yaml |
1 | apiVersion: apps/v1 |
验证查看
1 | [root@node-22 ~]# kubectl get cs |
通过Service暴露服务
暴露服务的三种方式
NodePort
将服务的类型设置成NodePort-每个集群节点都会在节点上打 开 一
个端口, 对于NodePort服务, 每个集群节点在节点本身(因此得名叫
NodePort)上打开一个端口,并将在该端口上接收到的流量重定向到基础服务。
该服务仅在内部集群 IP 和端口上才可访间, 但也可通过所有节点上的专用端
口访问。
LoadBalane
将服务的类型设置成LoadBalance, NodePort类型的一 种扩展,这使得
服务可以通过一个专用的负载均衡器来访问, 这是由Kubernetes中正在运行
的云基础设施提供的。 负载均衡器将流量重定向到跨所有节点的节点端口。
客户端通过负载均衡器的 IP 连接到服务。
Ingress
创建一 个Ingress资源, 这是一 个完全不同的机制, 通过一 个IP地址公开多
个服务,就是一个网关入口,和springcloud的网关zuul、gateway类似。
编写服务yaml文件
1 | apiVersion: v1 |
外部访问
1 | http://node7-33.host.com:18080/ |
基础组件安装总结
DNS节点:安装了bind9自建的DNS服务、Nginx服务及反代
运维管理节点:进行证书CA签发、Harbor镜像仓库私服
主节点:Etcd服务、Nginx服务、keepalived
计算节点:etcd服务、supervisor、kube-apiserver组件、kube-controller-manager组件、kubelet组件、kube-scheduler组件、kube-proxy组件、IPVS
路漫漫其修远兮,吾将上下而求索!