Kubernetes 这个单词源于希腊语,意为“舵手”或“飞行员”。
Kubernetes,也称为K8S,其中8是代表中间“ubernete”的8个字符,是Google在2014年开源的一个容器编排引擎,作为CNCF(Cloud Native Computing Foundation;云原生计算基金会)最重要的组件之一
Kubernetes用于自动化容器化应用程序的部署、规划、扩展和管理,它将组成应用程序的容器分组为逻辑单元,以便于管理和发现,用于管理云平台中多个主机上的容器化的应用
Kubernetes 的目标是让部署容器化的应用简单并且高效,很多细节都不需要运维人员去进行复杂的手工配置和处理
GitHub - kubernetes/kubernetes: Production-Grade Container Scheduling and Management
Kubernetes是采用Go语言(Go语言是谷歌2009发布的一款开源编程语言)开发
k8s集群控制节点,对集群进行调度管理,接受集群外用户去集群操作请求
Master Node 由 API Server、Scheduler、ClusterState Store(ETCD 数据库)和 Controller MangerServer 组成
kube-apiserver提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制。
当需要与 Kubernetes 集群进行交互时,就要通过 API。 Kubernetes API是 Kubernetes Control Plane的前端,用于处理内部和外部请求。API 服务器会确定请求是否有效,如果有效,则对其进行处理。用户通过 REST 调用、kubectl 命令行界面或其他命令行工具(例如 kubeadm)来访问 API。
kube-scheduler负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上
调度程序会考虑容器集的资源需求(例如 CPU 或内存)以及集群的运行状况。随后,它会将容器集安排到适当的计算节点。
kube-controller-manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等
控制器负责实际运行集群,而 Kubernetes 控制器管理器则是将多个控制器功能合而为一。控制器用于查询调度程序,并确保有正确数量的容器集在运行。如果有容器集停止运行,另一个控制器会发现并做出响应。控制器会将服务连接至容器集,以便让请求前往正确的端点。还有一些控制器用于创建帐户和 API 访问令牌。
etcd保存了整个集群的状态
应用的配置数据以及有关集群状态的信息位于etcd(k-v数据库)中。etcd 采用分布式、容错设计,被视为集群的最终事实来源
集群工作节点,运行用户业务应用容器
Nodes节点也叫Worker Node,包含kubelet、kube proxy 和 Pod(Container Runtime)
Pod是 Kubernetes 对象模型中最小、最简单的单元
它代表了应用的单个实例。每个Pod都由一个容器(或一系列紧密耦合的容器)以及若干控制容器运行方式的选件组成。Pod可以连接至持久存储,以运行有状态应用
Container runtime负责镜像管理以及Pod和容器的真正运行(CRI)
为了运行容器,每个Node都有一个容器运行时引擎。比如Docker,但 Kubernetes 也支持其他符合开源容器运动(OCI)标准的容器,例如 rkt 和 CRI-O。Kubernetes支持实现了CRI接口的其他大多数的容器
kubelet负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理
每个计算节点中都包含一个 kubelet,这是一个与Control Plane通信的微型应用。kublet 可确保容器在Pod内运行。当Control Plane需要在节点中执行某个操作时,kubelet 就会执行该操作
kube-proxy负责为Service提供cluster内部的服务发现和负载均衡
每个计算节点中还包含 kube-proxy,这是一个用于优化 Kubernetes 网络服务的网络代理。kube-proxy 负责处理集群内部或外部的网络通信(靠操作系统的数据包过滤层,或者自行转发流量)
1、minikube
minikube可以在本地运行Kubernetes的工具,minikube可以在个人计算机(包括Windows,macOS和Linux PC)上运行一个单节点Kubernetes集群,以便可以试用Kubernetes或进行日常开发工作
2、kind
Kind和minikube类似的工具,让你在本地计算机上运行Kubernetes,此工具需要安装并配置Docker
3、kubeadm
Kubeadm是一个K8s部署工具,提供kubeadm init 和 kubeadm join两个操作命令,可以快速部署一个Kubernetes集群;
官方地址:
Installing kubeadm | Kubernetes
4、二进制包
从Github下载发行版的二进制包,手动部署安装每个组件,组成Kubernetes集群,步骤比较繁琐,但是可以对各个组件有更清晰的认识
5、yum安装
通过yum安装Kubernetes的每个组件,组成Kubernetes集群,不过yum源里面的k8s版本已经比较老,所以这种方式用得也比较少了
6、第三方工具
有一些大神封装了一些工具,利用这些工具进行k8s环境的安装;
7、花钱购买
直接购买类似阿里云这样的公有云平台k8s
kubeadm是官方社区推出的一个用于快速部署 kubernetes 集群的工具,这个工具能通过两条指令完成一个kubernetes集群的部署
1、创建一个Master节点:kubeadm init
2、将Node节点加入到Master集群中: kubeadm join
(1)一台或多台机器,操作系统CentOS 7.x-86_x64
(2)硬件配置:内存2GB或2G+,CPU 2核或CPU 2核+
(3)集群内各个机器之间能相互通信
(4)禁止swap分区
(5)集群内各个机器可以访问外网,需要拉取镜像
如果环境不满足要求,会报错如下
1、关闭防火墙
- systemctl stop firewalld
- systemctl disable firewalld
2、 关闭selinux
- sed -i 's/enforcing/disabled/' /etc/selinux/config #永久
- setenforce 0 #临时
3、 关闭swap(k8s禁止虚拟内存以提高性能)
- sed -ri 's/.*swap.*/#&/' /etc/fstab #永久
- swapoff -a #临时
4、 在master添加hosts
- cat >> /etc/hosts << EOF
- 192.168.132.129 k8smaster
- 192.168.132.130 k8snode
- EOF
5、设置网桥参数
- cat > /etc/sysctl.d/k8s.conf << EOF
- net.bridge.bridge-nf-call-ip6tables = 1
- net.bridge.bridge-nf-call-iptables = 1
- EOF
- sysctl --system #生效
6、同步时间
- yum install ntpdate -y #如果没有ntpdate命令先安装
- ntpdate time.windows.com
所有服务器节点安装 Docker/kubeadm/kubelet/kubectl
Kubernetes 默认容器运行环境是Docker,因此首先需要安装Docker
我们可以按照下述方式安装指定版本Docker
- //更新docker的yum源
- yum install wget -y
-
- wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
-
- //安装指定版本的docker:
- yum install docker-ce-20.10.0 -y
Install Docker Engine on CentOS | Docker Documentation
Docker Engine release notes | Docker Documentation
配置加速器加速下载
/etc/docker/daemon.json 如果此文件不存在,先创建
- {
- # 阿里云镜像加速器;可自己注册复制过来
- "registry-mirrors": ["https://registry.docker-cn.com"]
- }
执行
systemctl enable docker.service
Kubelet:
运行在cluster所有节点上,负责启动POD和容器
Kubeadm:
用于初始化cluster的一个工具
Kubectl:
kubectl是kubenetes命令行工具,通过kubectl可以部署和管理应用,查看各种资源,创建,删除和更新组件
- 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
Kubernetes版本如下
yum install kubelet-1.19.4 kubeadm-1.19.4 kubectl-1.19.4 -y
查看是否安装:
- yum list installed | grep kubelet
-
- yum list installed | grep kubeadm
-
- yum list installed | grep kubectl
查看安装的版本:
- kubeadm version
- kubectl version --client
- kubelet --version
安装完成后执行
systemctl enable kubelet.service
重启CentOS: reboot
Linux centos重启命令:
1、reboot 普通重启
2、shutdown -r now 立刻重启(root用户使用)
3、shutdown -r 10 过10分钟自动重启(root用户使用)
4、shutdown -r 10:30 在时间为10:30重启(root用户使用)
(2)在master机器上执行
- kubeadm init
- --apiserver-advertise-address=192.168.133.129
- --control-plane-endpoint=master
- --image-repository registry.aliyuncs.com/google_containers
- --kubernetes-version v1.19.4
- --service-cidr=10.96.0.0/12
- --pod-network-cidr=10.244.0.0/16
参数说明:
--apiserver-advertise-address 集群通告地址,主节点id
--control-plane-endpoint 主节点的主机名
--image-repository 由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址
--kubernetes-version K8s版本,与上面安装的一致
--service-cidr 集群内部虚拟网络,Pod统一访问入口
--pod-network-cidr Pod网络,与下面部署的CNI网络组件yaml中保持一
注:
service-cidr 的选取不能和PodCIDR及本机网络有重叠或者冲突,一般可以选择一个本机网络和PodCIDR都没有用到的私网地址段,比如PODCIDR使用10.244.0.0/16, 那么service cidr可以选择10.96.0.0/12,网络无重叠冲突即可
执行报错
重启一下centos,然后再执行上面的 kubeadm init 命令
试了一下,重启centos还是会报同样的错误仔细排查;“kube-apiserver.yaml,kube-controller-manager.yaml,kube-scheduler.yaml,etcd.yaml” 这几个yaml文件已经存在了,只要重置一下即可
- kubeadm reset
- mv /etc/containerd/config.toml /tmp/
- systemctl restart containerd
然后重新输入上述的 kubeadm init 命令,会拿到如下输出,粘贴最后一段
kubeadm join IP:PORT --token XX \
--discovery-token-ca-cert-hash sha256:XX
备用(集群添加新节点,执行的命令就是kubeadm init最后输出的kubeadm join命令)
- kubeadm join 192.168.133.129:6443 --token vx912w.g8wyei3zo8qem1mq \
- --discovery-token-ca-cert-hash sha256:5c08ca34fed1e3fcef41e581970d3046ac85db10ee4a3875efb0bca5c8f8b104
上图中1 表示 初始化成功
2 表示 集群还需要的操作
3 表示 添加节点令牌(24小时有效期,过期再去获取令牌即可)
重新获取令牌
kubeadm token create --print-join-command
(2)在master机器上执行(配置环境变量)
- mkdir -p $HOME/.kube
- sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
- sudo chown $(id -u):$(id -g) $HOME/.kube/config
-
- kubectl get nodes
如果遇到如下报错:
- sudo: /etc/sudoers is world writable
- sudo: no valid sudoers sources found, quitting
- sudo: unable to initialize policy plugin
因为 /etc/sudoers 文件只读,所以sudo chmod 777 /etc/sudoers ,结果可以修改这个文件了,但是导致所有用户的sudo都不能用了
我们可以输入命令修改sudoers的权限:
- chmod 0440 /etc/sudoers
- reboot
再输入 reboot重启即可
kubectl get nodes
向集群添加新节点,执行的命令就是kubeadm init最后输出的kubeadm join命令
- kubeadm join 192.168.133.129:6443 --token vx912w.g8wyei3zo8qem1mq \
- --discovery-token-ca-cert-hash sha256:5c08ca34fed1e3fcef41e581970d3046ac85db10ee4a3875efb0bca5c8f8b104
kubectl get nodes
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml
不会立即就绪,需要等一会儿,节点才会就绪
检查状态是否成功
- kubectl get cs
- kubectl cluster-info
查看运行时容器pod(一个pod里面运行了多个docker容器)
kubectl get pods -n kube-system
在集群中创建一个pod,验证是否正常运行
1、在Kubernetes集群中部署一个Nginx
1、在网上拉取一个nginx镜像
kubectl create deployment nginx --image=nginx
2、对外暴露一个80端口
kubectl expose deployment nginx --port=80 --type=NodePort
3、查看对外端口
kubectl get pod,svc
4、访问地址:http://NodeIP:Port
2、在Kubernetes集群中部署一个Tomcat
- kubectl create deployment tomcat --image=tomcat
-
- kubectl expose deployment tomcat --port=8080 --type=NodePort
-
- kubectl get pod,svc
访问地址:http://NodeIP:Port