1、K8S介绍
k8s:全称(kubernetes),是用于自动部署,扩展和管理容器化应用的程序的开源系统,他将组成应用程序的容器组合成逻辑单元,与便于管理和服务发现。
2、K8S的功能
(1)、k8s可以使用DNS名称或自己IP地址公开容器,如果进入容器的流量很大时,,kubernetes可以负载负载并分发流量,从而使部署更加稳定。
常用的DNS有coreDNS,用作服务发现和集群中的容器通讯
负载均衡:service,可以对进行对外暴漏服务,同时也提供ingress插件接口对外暴漏服务
问:既然service可以提供对外暴漏服务,为什么还要ingress呢:
答: 首先,当pod中的容器需要向外暴露时,service会给pod给一个端口,但是当服务越来越多的时候,端口也会越来越多,管理起来,难度更大,这时就提供了ingress,他相当于nginx代理,这样我们就不在管service有哪些端口,我们只需要设置ingress-nginx的转发策略即可
(2)、存储编排
k8s允许你自动挂载自己的存储系统,如本地存储,公有云提供的,都行,对于集群内部的应用有时会需要持久化数据,这时容器如果被删除也会随之消失,所以一个稳定的外部存储集群就显得很重要,常见的对K8s提供存储能力的集群有:heketi+gluesrfs、rook+ceph、华为云OBS,阿里云OSS等,可以直接配合集群内的storageclass直接向存储集群申请存储空间
(3)、自动部署和回滚
可以使用K8S描述已经部署容器的所需状态,它可以以受控的速率将实际状态更改为期望状态,
如:自动化K8S来部署创建新容器,删除现有的容器并将它们的所有资源用于刚创建的新容器,控制k8s集群中的容器的状态大多数时间都会采用YAML资源配置清单的形式,方便记忆也容易识别
(4)自动完成装箱计算
K8s允许你指定每个容器所需的CPU和MEM,当容器制定了资源请求时,K8S可以做出更好的决策来管理容器的资源,
(5)自我修复
K8S重启失败的容器,替换容器,杀死不响应用户自定义的运行状况检查容器,并且在准备好服务之前部将其通告给客户端,在创建POD的时候,只有当设置在pod中的探针全部探测正常后才会将pod连接到集群内网络中对外进行服务,否则将通过监控告警给运维人员,同样的对于k8s中的容器会受到kubelet和apiserver的双重管理,kubelet上报容器的运行状态,api向etcd中请求期望状态,比较后让其达到期望的状态,从而保证其功能/服务容器永久保持在线
(6)密钥和配置管理
K8S运行存储和管理敏感信息,如,密码,oauth令牌和ssh密钥,你可以在不重建容器镜像的情况下部署和更新密码和应用程序的配置,也无需在堆栈配置中的暴露密钥,对于无状态应用(如:nginx)的配置文件,可以使用K8S中的configmap资源进行存储,但是密码和一些私密信息可以使用secret资源进行存储,从而避免频繁的更改和私密信息泄漏的风险,
3、k8s的架构和组件
它是由MASTER-WORKER组成的,
1、api-server:是集群中的大脑中枢,是K8S的控制面前端,api-server在设计上考虑了水平伸缩,也就是说,可以通过部署多个实例进行伸缩,并在这些实例之间平衡流量
2、etcd:是一款一致性和高可用性的键值对数据库,可以保存集中的后台数据,如,pod的期望状态等
3、scheduler:控制平面组件,负责监视新创建的,还未指定运行的pod和node,选择pod在合适的node节点上运行,调度决策考虑的因素包括单个的pod和pod集合的资源需求,软硬件策略约束,亲和性和反亲和性规范,数据位置,工作负载间的干扰和最后时限
4、controller-manager:运行控制器进程的控制平面组件,从逻辑上讲,每个控制器都是一个单独的进程,但是为了降低复杂性,
5、kubelet:每个Node节点上的kubelet定期就会调用API-Server的REST接口报告自身状态情况,API-Server接收这些信息后,将节点状态信息更新到etcd中。kubelet也通过API Server监听Pod信息,从而对Node机器上的POD进行管理:如创建、删除、更新Pod
6、kube-proxy:提供网络代理和负载均衡,是实现service的通信与负载均衡机制的重要组件,kube-proxy负责为Pod创建代理服务,从apiserver获取所有service信息,并根据service信息创建代理服务,实现service到Pod的请求路由和转发,从而实现K8s层级的虚拟转发网络,将到service的请求转发到后端的pod上。
7、kubectl:控制k8s集群的命令行工具
K8S中的IP
nodeIP:是node节点的IP
podIP:就是pod的ip
clusterIP:就是service的IP,他的ip是serviceIP段分配的
service:主要作用就是对pod容器提供向外暴露服务的作用,
主要表现形式有三种:
1、clusterIP:不能对外访问,只能是在集群内访问
2、nodeport:是根据端口进行访问,容器端口会绑定到宿主机上,根据ip+端口进行访问
3、loadbalancer:需要公网IP,他是根据负载均衡对外进行访问,如华为云用的ELB
使用kubeadm搭建
1准备工作
master | 192.168.43.164 <=2U4G centos7.6 |
worker | 192.168.43.165 <=2U4G centos7.6 |
service ip端 | 10.96.0.0/12 |
PODip | 172.17.34.12/12 |
关闭防火墙,selinux,关闭swap,修改主机名,修改hosts域名解析文件,修改内核参数,
#关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
systemctl status firewalld
#关闭selinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
getenforce
#关闭swap分区
swapoff -a
vim /etc/fstab
将swap挂载的那以后加“#”注销掉
#配置hosts文件
cat >> /etc/hosts <<EOF
192.168.43.164 k8s-master1
192.168.43.165 k8s-worker1
EOF
#修改内核参数
modprobe br_netfilter
cat > /etc/sysctl.d/k8s.conf <<EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
EOF
sysctl -p /etc/sysctl.d/k8s.conf
2、安装docker和containerd,说明,k8s从1.24版本后就不在支持docker,所以要安装containerd,这里安装docker就是为了方便制作镜像,拉取镜像
#安装阿里云repo源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3、配置安装k8s命令行工具需要的阿里云的yum源
cat > /etc/yum.repos.d/kubernetes.repo <<EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
EOF
4、配置时间同步
yum -y install ntpdate
ntpdate cn.pool.ntp.org
#添加定时任务,每分钟校准一次
crontab -e
* * * * * /usr/sbin/ntpdate cn.pool.ntp.org
systemctl restart crond
5、安装containerd
yum -y install containerd.io-1.6.6
生成containerd的配置文件
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
#修改配置文件,打开/etc/containerd/config.toml
#把SystemdCgroup = false修改成SystemdCgroup = true
#把sandbox_image = "k8s.gcr.io/pause:3.6"修改成#sandbox_image="registry.aliyuncs.com/google_containers/pause:3.7"
#SystemdCgroup = true表示把containerd驱动变成systemd
设置开机自启动
systemctl enable containerd --now
#查看状态
systemctl status containerd
6、安装docker-ce
yum -y install docker-ce
tee /etc/docker/daemon.json << 'EOF'
{
"registry-mirrors":["https://vh3bm52y.mirror.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com"],
"exec-opts": ["native.cgroupdriver=systemd"]
}
EOF
systemctl start docker && systemctl enable docker.service
7、安装k8s所需的组件
yum install -y kubelet-1.26.0 kubeadm-1.26.0 kubectl-1.26.0
systemctl enable kubelet
8、在master上初始化集群,node节点上不需要初始化
kubeadm config print init-defaults > kubeadm.yaml
需要修改kubeadm.yaml文件
将advertiseAddress: master主机的IP,criSocket://containerd.sock文件的绝对路径,
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
serviceSubnet: 默认/修改自己的IP段,不能和advertiseAddress,podSubnet的IP互相不是同一个段
在serviceSubnet: IP下一行增加podSubnetIP
在文件最后追加一下内容
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs
---
apiVersion: kubelet.config.k8s.io/v1beta1
kind: KubeletConfiguration
cgroupDriver: systemd
9、使用kubeadm初始化集群
kubeadm init --config=kubeadm.yaml --ignore-preflight-errors=SystemVerification
将红圈中的内容复制运行,生成kubectl的config权限文件,
10、使用命令查看node节点
kubectl get nodes
11、加入node节点
#在master上生成token,将生成出来的token复制,在k8s-worker1中运行
kubeadm token create --print-join-command
#查看添加是否成功
kubectl get nodes
此时,节点的状态是NotReady,属于正常,因为还没有安装网络插件
这里我安装的calico,可以做网络隔离,
12、安装calico
yum -y install git
git checkout manual-installationv1.22.x && cd calico/
#修改Pod网段为自己配置的Pod网段
POD_SUBNET=`cat /etc/kubernetes/manifests/kube-controller-manager.yaml | grep cluster-cidr= | awk -F= '{print $NF}'`
sed -i "s/POD_CIDR/$(POD_SUBNET)/g" calico.yaml
kubectl apply -f calico.yaml