kubernetes,是一个全新的基于容器技术的分布式架构领先方案,为谷歌公司所研发。Kubernetes是一个开源的容器编排和管理系统,用于自动化部署、扩展和管理容器化应用程序。它提供了一种可靠且可扩展的方式来运行和管理容器化应用程序,使开发人员能够轻松地部署和管理应用程序的容器化部署。
Kubernetes的核心概念是集群,它由一组物理或虚拟机器组成,称为节点。每个节点运行著一个容器运行时环境,如Docker,用于运行容器。Kubernetes通过使用集群中的多个节点来分发和管理容器,并确保它们的状态和可用性。目的是为了实现自动化。
Kubernetes的主要功能如下:
一个kubernetes集群主要是由控制节点(master)、**工作节点(node)**构成,每个节点上都会安装不同的组件。
master:集群的控制平面,负责集群的决策 ( 管理 )
node:集群的数据平面,负责为容器提供运行环境 ( 干活 )
附加组件:
kube-dns/coredns: 提供集群内部的DNS解析服务,用于服务发现和名称解析。
kube-dashboard: 提供Web界面用于集群的可视化管理和监控。
Ingress Controller: 负责处理集群外部流量的入口,并将流量路由到相应的服务。
Heapster/Metrics Server: 收集和暴露集群和容器的性能指标数据。
Horizontal Pod Autoscaler (HPA): 根据CPU等度量指标自动调整Pod副本数量。
Cluster Autoscaler: 根据节点资源的需求自动调整集群的节点数量。
Persistent Volume (PV) 和 Persistent Volume Claim (PVC): 用于管理持久化存储卷的声明和使用。
下面,以部署一个nginx服务来说明kubernetes系统各个组件调用关系:
首先要明确,一旦kubernetes环境启动之后,master和node都会将自身的信息存储到etcd数据库中。
一个nginx服务的安装请求会首先被发送到master节点的apiServer组件。
apiServer组件会调用scheduler组件来决定到底应该把这个服务安装到哪个node节点上。
在此时,它会从etcd中读取各个node节点的信息,然后按照一定的算法进行选择,并将结果告知apiServer。
apiServer调用controller-manager去调度Node节点安装nginx服务
kubelet接收到指令后,会通知docker,然后由docker来启动一个nginx的pod。
pod是kubernetes的最小操作单元,容器必须跑在pod中至此,
一个nginx服务就运行了,如果需要访问nginx,就需要通过kube-proxy来对pod产生访问的代理。
这样,外界用户就可以访问集群中的nginx服务了。
Pod(荚舱):是Kubernetes的最小部署单位,它可以包含一个或多个相关的容器。Pod中的容器共享相同的网络命名空间、IP地址和存储卷。
副本集(Replica Set):用于确保指定数量的Pod副本在集群中运行。如果Pod数量不足或Pod异常终止,副本集将自动创建或调整Pod的数量。
Master:集群控制节点,每个集群需要至少一个master节点负责集群的管控
Node:工作负载节点,由master分配容器到这些node工作节点上,然后node节点上的docker负责容器的运行
服务(Service):用于定义一组Pod的访问方式。服务具有固定的IP地址和DNS名称,可以在集群内部或从集群外部访问应用程序。
部署(Deployment):用于指定应用程序的部署配置,包括Pod模板、副本数量和更新策略。部署可以自动创建和管理相应的副本集。
名称空间(Namespace):用于隔离和组织集群中的资源。不同的名称空间可以拥有相同名称的资源,并允许不同的团队或项目在集群中独立操作。
标签(Label):是用于对资源进行标记和分类的键值对。
控制器(Controller):Kubernetes中的控制器是用于监控和维护目标状态的组件。它们可以确保集群中的资源保持在目标状态,并根据需要进行调整。
kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。
这个工具能通过两条指令完成一个kubernetes集群的部署:
# 创建一个 Master 节点
$ kubeadm init
# 将一个 Node 节点加入到当前集群中
$ kubeadm join
在开始之前,部署Kubernetes集群机器需要满足以下几个条件:
-至少3台机器,操作系统 CentOS7+
环境说明
主机名 | ip | 角色 | 系统版本 |
---|---|---|---|
kiwi111 | 192.168.234.33 | master | CentOS8 |
kiwi222 | 192.168.234.123 | node1 | CentOS8 |
kiwi333 | 192.168.234.111 | node2 | CentOS8 |
首先关闭swap分区,所有主机都要做
//临时关闭
swapoff -a
//永久关闭,关掉之后要重启主机
[root@kiwi111 ~]# vim /etc/fstab
## 将下面一行删掉或者注释掉即可
#/dev/mapper/cs-swap none swap defaults 0 0
关闭防火墙以及修改selinux,所有主机都要做
[root@kiwi111 ~]# systemctl disable --now firewalld
[root@kiwi111 ~]# setenforce 0
[root@kiwi111 ~]# sed -i 's/^SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
在所有主机上添加hosts
[root@kiwi111 ~]# vim /etc/hosts
192.168.234.33 kiwi111
192.168.234.123 kiwi222
192.168.234.111 kiwi333
将桥接的IPv4流量传递到iptables的链
//k8s.conf文件需要自己创建
[root@kiwi111 ~]# 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
//执行下面这条命令生效
[root@kiwi111 ~]# sysctl --system
时间同步,所有主机要做
[root@kiwi111 ~]# yum -y install chrony
[root@kiwi111 ~]# systemctl enable --now chronyd
//master主机
[root@kiwi111 ~]# vim /etc/chrony.conf
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
pool time1.aliyun.com iburst ## 修改这一行
······························略
[root@kiwi111 ~]# systemctl restart chronyd
//设置时区
[root@kiwi111 ~]# timedatectl set-timezone Asia/Shanghai
[root@kiwi111 ~]# chronyc sources
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* 203.107.6.88 2 6 367 16 -472us[ -299us] +/- 35ms
//node1主机
[root@kiwi222 ~]# vim /etc/chrony.conf
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
pool kiwi111 iburst ## 修改这一行
······························略
[root@kiwi222 ~]# systemctl restart chronyd
[root@kiwi222 ~]# timedatectl set-timezone Asia/Shanghai
[root@kiwi222 ~]# chronyc sources
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^? kiwi111 0 6 0 - +0ns[ +0ns] +/- 0ns
//node2主机
[root@kiwi333 ~]# vim /etc/chrony.conf
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
pool kiwi111 iburst ## 修改这一行
······························略
[root@kiwi333 ~]# systemctl restart chronyd
[root@kiwi222 ~]# timedatectl set-timezone Asia/Shanghai
[root@kiwi333 ~]# chronyc sources
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^? kiwi111 0 6 0 - +0ns[ +0ns] +/- 0ns
在master主机上配置免密登录
[root@kiwi111 ~]# ssh-keygen -t rsa
[root@kiwi111 ~]# ssh-copy-id kiwi111
[root@kiwi111 ~]# ssh-copy-id kiwi222
[root@kiwi111 ~]# ssh-copy-id kiwi333
[root@kiwi111 ~]# for i in kiwi111 kiwi222 kiwi333;do ssh $i 'date';done
Mon Nov 13 15:16:10 CST 2023
Mon Nov 13 15:16:10 CST 2023
Mon Nov 13 15:16:10 CST 2023
Kubernetes默认CRI(容器运行时)为Docker,因此先安装Docker。
//所有主机都要安装docker
[root@kiwi111 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@kiwi111 ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@kiwi111 ~]# sed -i 's+download.docker.com+mirrors.aliyun.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
[root@kiwi111 ~]# yum -y install docker-ce
//设置开机自启
[root@kiwi111 ~]# systemctl enable --now docker
//配置加速器
[root@kiwi111 ~]# mkdir -p /etc/docker
[root@kiwi111 ~]# tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://ye25aygs.mirror.aliyuncs.com"]
}
EOF
[root@kiwi111 ~]# systemctl restart docker
//所有主机都要装
[root@kiwi111 ~]# 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
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
//所有主机都要装
[root@kiwi111 ~]# yum install -y kubelet kubectl kubeadm
[root@kiwi222 ~]# yum install -y kubelet kubectl kubeadm
[root@kiwi333 ~]# yum install -y kubelet kubectl kubeadm
//设置开机自启,但先不要启动,如果是启动的一定要将它停止
[root@kiwi111 ~]# systemctl enable kubelet
//在所有主机上都要执行
[root@kiwi111 ~]# containerd config default > /etc/containerd/config.toml
[root@kiwi111 ~]# vim /etc/containerd/config.toml
## 修改这一行
sandbox_image = "registry.aliyuncs.com/google_containers/pause:3.6"
[root@kiwi111 ~]# systemctl restart containerd
[root@kiwi111 ~]# systemctl enable containerd
//将这个文件传给另外两个节点
[root@kiwi111 ~]# scp /etc/containerd/config.toml kiwi222:/etc/containerd/
[root@kiwi111 ~]# scp /etc/containerd/config.toml kiwi333:/etc/containerd/
//重启服务
[root@kiwi222 ~]# systemctl restart containerd
[root@kiwi222 ~]# systemctl enable containerd
//重启服务
[root@kiwi333 ~]# systemctl restart containerd
[root@kiwi333 ~]# systemctl enable containerd
以下操作在Master上执行
//初始化
[root@kiwi111 ~]# kubeadm init \
--apiserver-advertise-address=192.168.234.33 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.28.2 \
--service-cidr=10.96.0.0/12 \
--pod-network-cidr=10.244.0.0/16
//将初始化后的结果保存到一个文件中
[root@kiwi111 ~]# cat kubernetes_init
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
Alternatively, if you are the root user, you can run:
export KUBECONFIG=/etc/kubernetes/admin.conf
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 192.168.234.33:6443 --token pi6f0o.e695bzkybrpbnnzp \
--discovery-token-ca-cert-hash sha256:06fe292b51f5c9fd4884dde35f1b1eedc83b1e66358ca388bf252a00ca2c1fc7
//添加环境变量
[root@kiwi111 ~]# echo 'export KUBECONFIG=/etc/kubernetes/admin.conf' > /etc/profile.d/kubernetes.sh
//配置网络
//安装pod网络插件
[root@kiwi111 ~]# wget https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
[root@kiwi111 ~]# kubectl apply -f kube-flannel.yml
//查看是否运行成功
[root@kiwi111 ~]# kubectl get -f kube-flannel.yml
将两台工作主机加入到这个集群中
//在两台node上执行
[root@kiwi222 ~]# kubeadm join 192.168.234.33:6443 --token pi6f0o.e695bzkybrpbnnzp \
--discovery-token-ca-cert-hash sha256:06fe292b51f5c9fd4884dde35f1b1eedc83b1e66358ca388bf252a00ca2c1fc7
[root@kiwi333 ~]# kubeadm join 192.168.234.33:6443 --token pi6f0o.e695bzkybrpbnnzp \
> --discovery-token-ca-cert-hash sha256:06fe292b51f5c9fd4884dde35f1b1eedc83b1e66358ca388bf252a00ca2c1fc7
//在master上查看是否加入成功
[root@kiwi111 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
kiwi111 Ready control-plane 23m v1.28.2
kiwi222 Ready <none> 2m54s v1.28.2
kiwi333 Ready <none> 2m46s v1.28.2
部署一个服务测试
[root@kiwi111 ~]# kubectl create deployment httpd --image=httpd
[root@kiwi111 ~]# kubectl expose deployment httpd --port=80 --type=NodePort
[root@kiwi111 ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
apache-7c5f54c97-6l5rq 0/1 ImagePullBackOff 0 7m48s 10.244.2.5 kiwi333 <none> <none>
httpd-5c98f79dfc-lvvlp 1/1 Running 0 26s 10.244.2.6 kiwi333 <none> <none>
tomcat-c89f9dd5f-rhjhx 1/1 Running 0 11m 10.244.1.3 kiwi222 <none> <none>
//验证是否部署成功
[root@kiwi111 ~]# curl 10.244.2.6
<html><body><h1>It works!</h1></body></html>