Kubernetes(简称 K8s)是一个开源的容器编排管理平台,用于自动化部署、扩展和管理容器化应用程序。它最初由 Google 设计和开发,并于2014年发布,目的是帮助开发人员和运维人员更轻松地部署、管理和扩展应用程序。Kubernetes 基于 Docker 技术,可以支持多种容器运行时,并提供了丰富的 API 和工具集,使得在 Kubernetes 上开发、部署和管理容器化应用程序变得更加简单和高效。
Kubernetes 具有以下优点:
Kubernetes 适用于以下场景:
微服务架构:Kubernetes 可以支持多个微服务的部署和管理,从而使得应用程序更加易于拆分、扩展和维护。
多云环境:Kubernetes 可以在多个云平台和本地环境中运行,使得应用程序更加容易实现云原生架构和跨云部署。
大规模应用:Kubernetes 可以支持大规模应用程序的部署和管理,从而提高应用程序的可靠性和性能。
Kubernetes 由以下几个核心组件组成:
基于minikube快速搭建kubernetes单节点环境
官方文档:https://kubernetes.io/zh-cn/docs/tutorials/hello-minikube/
从 Minikube 的架构中可以看出 master 节点与其它节点合为一体,而整体则通过宿主机上的 kubectl 进行管理,这样可以更加 节省资源。
小脚本一键安装yum源,docker,配置镜像加速,安装docker-compose。
#安装yum源
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && yum clean all &&yum makecache && yum -y install lrzsz
#安装docker
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine && yum install -y yum-utils && sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo && yum makecache fast && yum install docker-ce docker-ce-cli containerd.io
#配置镜像加速
sudo mkdir -p /etc/docker && sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://lmsabin0.mirror.aliyuncs.com"],
"registry-mirrors":["https://reg-mirror.qiniu.com/"]
}
EOF
#启动docker
sudo systemctl daemon-reload && sudo systemctl start docker
#安装docker-compose并启动
sudo curl -L "https://get.daocloud.io/docker/compose/releases/download/1.27.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose && chmod +x /usr/local/bin/docker-compose
操作 minikube 需要一个具有 root 权限的用户(非root)
并且需要将该用户添加进入 docker 用户组
创建新用户并设置密码
添加该用户至 docker 用户组:
更新 docker 用户组:
切换新创建的用户来操作 minikube,我这里创建的用户为testuser
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
下载minikube的最新版本并安装到/usr/local/bin目录中。minikube是一个用于在本地运行Kubernetes的工具,是搭建Kubernetes集群的必要工具之一。
curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
chmod +x ./kubectl`
sudo mv ./kubectl /usr/local/bin/kubectl
下载kubectl的最新版本并安装到/usr/local/bin目录中。kubectl是Kubernetes的命令行工具,用于与Kubernetes API进行交互。
参考:https://minikube.sigs.k8s.io/docs/start/
minikube start --image-mirror-country='cn' --kubernetes-version=v1.23.8
image-mirror-country 为指定使用国内源
kubernetes-version 指定部署的版本(最新版兼容性坑比较多,所以选择低版本)
查看状态
[testuser@895v7hehi4cexhft ~]$ minikube status
minikube
type: Control Plane
host: Running
kubelet: Running
apiserver: Running
kubeconfig: Configured
可直接使用 minikube 自带的 kubectl 命令。
获取集群所有节点(机器):
minikube kubectl get nodes
获取集群所有命名空间:
minikube kubectl get namespaces
查看集群所有 Pod:
minikube kubectl – get pods -A
由于 minikube 内置的 kubectl 命令功能不全,所以最好独立安装一个 kubectl
用以下命令下载最新发行版:
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
安装 kubectl:
sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl
查看版本的详细信息:
kubectl version --client --output=yaml
minikube dashboard
部署dashboard到集群中。dashboard是一个Web界面,用于方便地管理和监控Kubernetes集群中的资源。
集群外部想要直接访问 dashboard 还需要设置代理才能访问,执行以下命令:
kubectl proxy --port=8001 --address='10.0.3.170' --accept-hosts='^.*' &
--port 需要暴露的端口号
--address 服务器外网IP(宿主机IP),云服务器私网IP(非公网)
--accept-hosts 外部访问服务器的IP(白名单)云主机记得开放安全组规则允许外部访问
这样就可以在浏览器上通过以下地址访问 Kubernetes Dashboard:
http://120.39.219.10:8001/api/v1/namespaces/kubernetes-dashboard/services/http:kubernetes-dashboard:/proxy/#/persistentvolume?namespace=default
120.39.219.10:8001(云服务器服务器公网IP)
到此就能够访问dashboard资源了。但是这种方式不适合生产环境。
这种暴露方式是通过在本地启动一个 kubectl 的代理服务,将对 Kubernetes 集群的 API Server 的请求转发到本地,以方便进行调试和测试。与其他暴露方式相比,具有以下不同点:
综上所述,这种暴露方式相比其他方式更为简单和安全,但只适用于开发和测试环境,不适用于生产环境。在选择暴露方式时,需要根据实际需求和环境特点进行综合考虑。
查看dashboard资源
sudo kubectl get services --namespace kubernetes-dashboard
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
dashboard-metrics-scraper ClusterIP 10.109.205.86 8000/TCP 18h
kubernetes-dashboard ClusterIP 10.109.133.78 80/TCP 18h
获取dashboard的服务地址和端口号。这个命令用于获取dashboard的访问地址,以便进入dashboard界面。
这是 Kubernetes Dashboard 和 Metrics Scraper 在集群中的 Service 资源对象信息。其中:
上面的输出中,两个资源对象都是 ClusterIP 类型的 Service,表示 Kubernetes Dashboard 和 Metrics Scraper 都是内部 Service,只在 Kubernetes 集群内部可用。其中:
需要注意的是,上面的输出中,Service 的 external-ip 字段为 ,表示该 Service 没有指定外部 IP 地址,只能在 Kubernetes 集群内部访问。如果需要让外部可以访问该 Service,需要将其暴露为外部 Service,如 NodePort、LoadBalancer 或 Ingress 等类型的 Service。
要让外部可以访问 Kubernetes Dashboard,需要将 Kubernetes Dashboard 通过公网 IP 地址和端口号暴露出来。可以使用 NodePort 类型的 Service 将 Kubernetes Dashboard 暴露在公网 IP 地址上,然后通过浏览器访问公网 IP 地址和端口号即可。
以下是使用 NodePort 类型的 Service 暴露 Kubernetes Dashboard 的步骤:
部署 Kubernetes Dashboard。
在 Kubernetes 集群中部署 Kubernetes Dashboard,可以使用以下命令完成:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.2.0/aio/deploy/recommended.yaml
这将在 Kubernetes 集群中创建一个名为 kubernetes-dashboard 的 Deployment 和一个名为 kubernetes-dashboard 的 Service。默认情况下,Service 的类型为 ClusterIP,只能在 Kubernetes 集群内部访问。
创建 NodePort 类型的 Service。
要将 Kubernetes Dashboard 暴露到外部,需要创建一个 NodePort 类型的 Service。可以使用以下命令创建一个名为 kubernetes-dashboard-nodeport 的 Service:
kubectl expose deployment kubernetes-dashboard --type=NodePort --name=kubernetes-dashboard-nodeport --port=80 --target-port=8443
这将在默认命名空间中创建一个名为 kubernetes-dashboard-nodeport 的 NodePort 类型的 Service。该 Service 将 Kubernetes Dashboard 的 8443 端口映射到一个随机的端口上,可以通过该端口在浏览器中访问 Kubernetes Dashboard。
获取 Service 的 NodePort 端口号和公网 IP 地址。
使用以下命令获取 Service 的 NodePort 端口号和公网 IP 地址:
kubectl get svc kubernetes-dashboard-nodeport
该命令将显示 kubernetes-dashboard-nodeport Service 的详细信息,包括其 NodePort 端口号和公网 IP 地址。
在浏览器中访问 Kubernetes Dashboard。
使用浏览器打开以下 URL,将其替换为 Kubernetes Dashboard 的公网 IP 地址和 NodePort 端口号:
https://<公网 IP 地址>:
这将打开 Kubernetes Dashboard 的登录页面,在该页面中输入相应的账号和密码,即可登录并访问 Kubernetes Dashboard。
需要注意的是,使用 NodePort 类型的 Service 暴露 Kubernetes Dashboard 可能存在安全风险,因为这会将 Kubernetes Dashboard 直接暴露到集群外部。在生产环境中,建议使用更加安全和专业的 Ingress 控制器来暴露 Kubernetes Dashboard。同时还要注意保护 Kubernetes Dashboard 的访问权限,只允许授权的用户或者 IP 地址访问。
这样,就可以使用公网IP地址访问Kubernetes集群中的Dashboard了。需要注意的是,在使用NodePort暴露Service可能会存在一些安全风险。因此,在使用NodePort时,请务必做好安全设置。一种更安全的方法是使用LoadBalancer类型的Service,这种类型的Service可以使用云平台提供的负载均衡器,而不需要直接暴露NodePort端口。
参考资料:
Kubernetes 官方文档(https://kubernetes.io/docs/home/)
《Kubernetes in Action》一书(作者:Marko Luksa)
Minikube 官方文档(https://minikube.sigs.k8s.io/docs/start/)
Kubernetes基础操作
在Kubernetes上,可以使用kubectl命令行工具来管理Pod和容器。以下是一些常用的kubectl命令:
kubectl get pods:获取集群中所有Pod的状态信息。
kubectl describe pod (pod-name):获取指定Pod的详细信息。
kubectl logs (pod-name):获取指定Pod的日志信息。
kubectl exec -it (pod-name) /bin/bash:进入指定Pod的容器内部的bash shell。
kubectl delete pod (pod-name):删除指定Pod。
此外,还可以使用YAML文件来定义Pod和容器的配置。可以使用kubectl apply -f 命令来应用这些配置文件。例如:
# my-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: ubuntu:latest
command: ["sleep", "3600"]
应用配置文件
kubectl apply -f my-pod.yaml
这个配置文件定义了一个名为my-pod的Pod,其中包含一个名为my-container的容器,使用ubuntu:latest镜像,并运行sleep命令。使用kubectl apply -f命令将这个配置文件应用到Kubernetes集群中,即可创建相应的Pod和容器。
在Kubernetes上,可以通过水平扩展来缩放应用程序。水平扩展可以根据应用程序的负载自动增加或减少Pod的数量,以满足应用程序的需求。
可以使用kubectl scale命令来进行水平扩展。例如,要将一个名为my-deployment的Deployment的Pod数量扩展到3个,可以使用以下命令:
kubectl scale deployment my-deployment --replicas=3
这个命令将my-deployment的Pod数量扩展到3个。如果要缩减Pod数量,可以将–replicas选项的值设置为更小的值。
此外,还可以使用自动扩展来根据应用程序的负载动态地调整Pod数量。可以使用Horizontal Pod Autoscaler(HPA)来配置自动扩展。HPA会监控Deployment或Replication Controller的CPU利用率或其他自定义指标,并根据配置的规则来自动扩展或缩减Pod数量。
当应用程序的负载增加时,可以使用HPA自动扩展Kubernetes Pod的数量。以下是一个使用HPA自动扩展的示例实验:
在Kubernetes中,Deployment是一种控制器,用于管理Pod的副本数量和更新策略。首先,我们需要创建一个Deployment,例如:
kubectl create deployment php-apache --image=k8s.gcr.io/hpa-example
这个命令将创建一个名为php-apache的Deployment,使用k8s.gcr.io/hpa-example镜像。
在Kubernetes中,Service用于暴露Pod的网络端口。如果要从外部访问Pod,需要创建一个Service。例如:
kubectl expose deployment php-apache --port=80 --target-port=80 --type=NodePort
这个命令将创建一个名为php-apache的Service,将本地端口80映射到Pod的端口80上。
下面我们将创建一个HPA,用于自动扩展Pod的数量。可以使用以下命令创建一个名为php-apache-hpa的HPA:
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
这个命令将创建一个HPA,根据CPU利用率自动调整Pod的数量。如果CPU利用率超过50%,HPA将自动扩展Pod的数量,但不会超过10个。最小Pod数量为1。
现在,我们可以模拟应用程序负载来测试自动扩展功能。可以使用以下命令启动一个负载测试:
kubectl run -i --tty load-generator --image=busybox /bin/sh
然后,在控制台中使用以下命令模拟负载:
while true; do wget -q -O- http://php-apache.default.svc.cluster.local; done
这个命令会不断地从Service中访问Pod,模拟负载。
可以使用以下命令来监视自动扩展的情况:
kubectl get hpa
kubectl describe hpa php-apache-hpa
第一个命令将显示HPA的概览信息,包括目标Deployment、CPU利用率和当前Pod数量等信息。第二个命令将显示详细的HPA配置信息,包括扩展和缩减Pod数量的阈值等信息。
当负载增加时,HPA将自动扩展Pod的数量,直到达到最大Pod数量。在本实验中,最大Pod数量为10。当负载减少时,HPA将自动缩减Pod的数量,直到达到最小Pod数量。在本实验中,最小Pod数量为1。
以上就是一个使用HPA自动扩展Kubernetes Pod数量的示例实验。注意,HPA需要根据实际的应用程序负载进行配置,以便自动扩展和缩减Pod数量。
实验:使用 kubectl 部署应用程序、管理 Pod 和容器、缩放应用程序
参考资料:
Kubernetes 官方文档(https://kubernetes.io/docs/home/)
《Kubernetes in Action》一书(作者:Marko Luksa)
命名空间是Kubernetes中用于进行资源隔离和权限控制的基本单元。使用命名空间可以将一个Kubernetes集群划分为多个逻辑部分,并为每个部分分配一定的资源和权限。这样可以避免不同应用程序之间的冲突和干扰,提高集群的可靠性和安全性。
在Kubernetes中,每个对象都属于一个命名空间。常见的对象包括Pod、Service、Deployment、ConfigMap、Secret等。这些对象可以通过命名空间进行隔离和管辖,以便在不同的应用程序之间进行区分和管理。
<