一 k8s组件功能
1 kube-apiserver
kube-apiserver | Kubernetes 官方介绍
API server 提供了k8s各类资源对象的增删改查以及watch等http rest接口。所有其他组件都它进行通信。是集群的统一入口,默认端口为6443
2 kube-scheduler
kube-scheduler | Kubernetes 官方介绍
调度器,负责将pod指派到某个节点上,先排除不符合条件的节点,然后在剩余的节点进行删选,最后选中节点,创建pod.
3 kube-controller-manager
kube-controller-manager | Kubernetes 官方介绍
负责维护集群的状态,比如程序部署,故障检查,自动扩展,滚动更新,确保集群中的pod正常工作
4 kube-proxy
kube-proxy | Kubernetes 官方介绍
运行在每个节点上,监听apiserver中服务对象的变化,再通过iptables或者ipvs实现网络的转发。主要负责集群内部的网络通信
5 kublet
kubelet | Kubernetes 官方介绍
kubelet 是运行在每个node节点上的代理组件,它监视每个node上的pod.
负责上master汇报node节点的健康状态
接受指令并在pod中创建docker容器
准备pod所需的数据卷
返回pod的运行状态
在node节点执行容器健康检查
6 kubectl
kubectl | Kubernetes
是集群管理的客户端工具
7 etcd
为 Kubernetes 运行 etcd 集群 | Kubernetes
负责存储集群中各种资源对象信息
8 dns
自定义 DNS 服务 | Kubernetes 官方介绍
负责为整个集群提供dns服务,从而实现服务直接的访问
二 k8s中创建pod的调度流程
1.用户使用create/apply yaml创建pod,请求给apiseerver,apiserver将yaml中的属性信息(metadata)写入etcd。
2.apiserver触发watch机制准备创建pod,信息转发给调度器,调度器使用调度算法选择node,调度器将node信息给apiserver,apiserver_将绑定的node信息写入etcd。
3.apiserver又通过watch机制,调用kubelet,指定pod信息,触发docker run命 令创建容器。
4.创建完成之后反馈给kubelet,kubelet又将pod的状态信息给apiserver,apiserver又将pod的状态信息写入etcd。
5.其中kubectl get pods命令调用的时etcd_的信息。
三 k8s系统环境准备
1 环境说明:
2 master 2etcd 2node 2高可用+harbor
master01 172.31.7.101
master02 172.31.7.102
etcd01 172.31.7.106
etcd02 172.31.7.107
node1 172.31.7.111
node2 172.31.7.112
ha1 172.31.7.109
ha2 172.31.7.110
虚拟vip 172.31.7.188
centos7.9
k8s.1.23
docker: docker-19.03.15-binary-install.tar.gz
2 所有服务器进行时间同步
echo "*/5 * * * * ntpdate time1.aliyun.com &> /dev/null && hwclock -w" >> /var/spool/cron/crontabs/root
3 系统初始化
主机名,ip,系统参数优化,seliunx关闭,开启ip转发
hostnamectl set-hostname k8s-node1
hostnamectl set-hostname k8s-node2
hostnamectl set-hostname k8s-etcd1
hostnamectl set-hostname k8s-etcd2
hostnamectl set-hostname k8s-master1
hostnamectl set-hostname k8s-master2
hostnamectl set-hostname k8s-ha1
hostnamectl set-hostname k8s-ha2
四 高可用服务器安装
1 安装haproxy,keepalived
yum install keepalived
yum install haproxy
2 keepalivd主配置文件如下:
vrrp_instance VI_1 {
state MASTER
interface ens33
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
virtual_ipaddress {
172.31.7.188 dev ens33 label ens33:1
}
}
3 启动keepalived
systemctl enable keepalived
systemctl start keepalived
从配置文件要更改一下权重,还有MASTER变为BACKUP
然后用ifconfig可以查看vip是否存在。
4 haproxy配置文件,两台配置一样
listen k8s_api_nodes_6443
bind 172.31.7.188:6443
mode tcp
server 172.31.7.101 172.31.7.101:6443 check inter 2000 fall 3 rise 5
server 172.31.7.102 172.31.7.102:6443 check inter 2000 fall 3 rise 5
5 启动haproxy
systemctl start haproxy
systemctl enable haproxy
五 在各个master和node节点 还有harbor上都安装docker
1 安装docker
cd /usr/local/src
tar -zxvf docker-19.03.15-binary-install.tar.gz
./docker-install.sh
六 安装harbor并启用https
1 生成证书
cd /usr/local/src
mkdir app
cd app
tar -zxvf harbor-offline-installer-v2.4.2.tgz
# 生成证书
openssl genrsa -out /usr/local/src/app/harbor/certs/harbor-ca.key
openssl req -x509 -new -nodes -key ./harbor-ca.key -subj "/CN=harbor.magedu.local" -days 7120 -out ./harbor-ca.crt
2 更改配置文件
[root@k8s-harbor01 harbor]# pwd
/usr/local/src/app/harbor
[root@k8s-harbor01 harbor]# cp harbor.yml.tmpl harbor.yml
# 配置文件只更改了如下选项,hostname,证书,密码
grep -v "^#" harbor.yml |grep -v "^$"|grep -v "#"
hostname: harbor.magedu.local
http:
port: 80
https:
port: 443
certificate: /usr/local/src/app/harbor/certs/harbor-ca.crt
private_key: /usr/local/src/app/harbor/certs/harbor-ca.key
harbor_admin_password: 123456
3 安装
./install.sh --with-trivy
./install.sh --help
运行完之后服务会自动启动
额外补充命令:
停止命令 docker-compose stop
启动命令 docker-compose up -d
删除镜像 docker-compose down --rmi all
docker-compose down [options]
停止和删除容器、网络、卷、镜像。 选项包括:
–rmi type,删除镜像,类型必须是:all,删除compose文件中定义的所有镜像;local,删除镜像名为空的镜像
-v, –volumes,删除已经在compose文件中定义的和匿名的附在容器上的数据卷
–remove-orphans,删除服务中没有在compose中定义的容器
七 部署docker登录证书
### 1 部署节点创建这个目录(也就是我的master节点)
mkdir -p /etc/docker/certs.d/harbor.magedu.local
# harbor上拷贝证书到部署节点
[root@k8s-harbor01 harbor]# scp -r /usr/local/src/app/harbor/certs/harbor-ca.crt root@172.31.7.101:/etc/docker/certs.d/harbor.magedu.local
2 添加hosts文件
[root@k8s-master01 ~]# cat /etc/hosts
172.31.7.109 harbor.magedu.local
重启docker
systemctl restart docker
3 登录,并上传镜像
docker login harbor.magedu.com
docker pull alpine
docker tag alpine harbor.magedu.com/library/alpine:mage
docker push harbor.magedu.com/library/alpine:mage
效果如图所示:
八 利用kubeasz进行集群安装
https://gitee.com/ilanni/kubeasz 版本对比
1 安装ansible
yum install epel-release
yum install ansible
2 生成密钥并拷贝到各个节点
ssh-keygen
拷贝脚本如下:
#!/bin/bash
ip="
172.31.7.102
172.31.7.111
172.31.7.112
172.31.7.106
172.31.7.107
"
for node in ${ip};do
sshpass -p redhat ssh-copy-id ${node} -o StrictHostKeyChecking=no
if [ $? -eq 0 ];then
echo "${node}密钥拷贝完成"
else
echo "${node}密钥拷贝失败"
fi
done
3 下载kubeasz 项目源码
不同的kubeasz版本,安装的k8s版本也不一样
# 下载工具脚本ezdown,举例使用kubeasz版本3.0.0
export release=3.2.0
wget https://github.com/easzlab/kubeasz/releases/download/${release}/ezdown
chmod +x ./ezdown
# 使用工具脚本下载
./ezdown -D
下载好的脚本包括镜像都存放到了/etc/kubeasz 这个目录
4 创建集群并生成配置文件
[root@k8s-master02 kubeasz]# ./ezctl new k8s-cluster01
2022-04-16 18:40:43 DEBUG generate custom cluster files in /etc/kubeasz/clusters/k8s-cluster01
2022-04-16 18:40:43 DEBUG set versions
2022-04-16 18:40:44 DEBUG disable registry mirrors
2022-04-16 18:40:44 DEBUG cluster k8s-cluster01: files successfully created.
2022-04-16 18:40:44 INFO next steps 1: to config '/etc/kubeasz/clusters/k8s-cluster01/hosts'
2022-04-16 18:40:44 INFO next steps 2: to config '/etc/kubeasz/clusters/k8s-cluster01/config.yml'
5 编辑host文件
vim /etc/kubeasz/clusters/k8s-cluster01/hosts
[etcd]
172.31.7.106
172.31.7.107
[kube_master]
172.31.7.101
172.31.7.102
[kube_node]
172.31.7.111
172.31.7.112
[harbor]
[ex_lb]
172.31.7.109 LB_ROLE=backup EX_APISERVER_VIP=172.31.7.188 EX_APISERVER_PORT=6443
172.31.7.110 LB_ROLE=master EX_APISERVER_VIP=172.31.7.188 EX_APISERVER_PORT=6443
[chrony]
[all:vars]
SECURE_PORT="6443"
CONTAINER_RUNTIME="docker"
CLUSTER_NETWORK="calico"
PROXY_MODE="ipvs"
SERVICE_CIDR="10.200.0.0/16"
CLUSTER_CIDR="10.100.0.0/16"
NODE_PORT_RANGE="30000-65000"
CLUSTER_DNS_DOMAIN="magedu.local"
bin_dir="/opt/kube/bin"
base_dir="/etc/kubeasz"
cluster_dir="{{ base_dir }}/clusters/k8s-cluster01"
ca_dir="/etc/kubernetes/ssl"
6 编辑config.yml
改证书时间
改k8s 集群 master 节点证书配置,可以添加多个ip和域名(比如增加公网ip和域名)
改node节点最大的pod数量
改harbor信任的节点,只针对http的,https不用配置
改calico ,默认就可以
改dns缓存,默认是true,线上环境可以是true
7 安装
./ezctl setup k8s-cluster01 01 #第一步
./ezctl setup k8s-cluster01 02
./ezctl setup k8s-cluster01 03
./ezctl setup k8s-cluster01 04
./ezctl setup k8s-cluster01 05
./ezctl setup k8s-cluster01 06
查看 节点的状态
8 验证calico
/opt/kube/bin/calicoctl node status
在master上查看网络,只能查看到node节点的,我这里只有一台node
在node节点上查看,只能看到master节点的
9 测试网络
用centos或者busybox都可以
kubectl run net-test1 --image=centos:7.9.2009 sleep 3600000
kubectl run net-test2 --image=centos:7.9.2009 sleep 3600000
kubectl run test --image=busybox sleep 30000
进入这两个pod之中,然后互相ping一下ip,看是否可以通信