一、容器与K8s
1、什么是容器
容器是一种轻量级的、可移植的虚拟化技术,将应用程序及其所有依赖项打包到一个可移植的图像中,以便在不同的计算环境中运行。容器提供了与虚拟机类似的隔离性,可以帮助开发人员在不同的环境中更加轻松地构建、打包、分发和部署应用程序。
2、什么是Kubernetes
Kubernetes(简称为K8s)是一个开源的容器编排平台。它可以帮助我们自动化地部署、扩展和管理容器化的应用程序,从而让我们更加轻松地管理复杂的分布式应用程序,同时也降低了运维的成本。
3、容器与K8s的关系
容器是K8s里面的基本组件,K8s通过容器对应用程序及其依赖项进行打包、分发和部署。K8s还提供了许多高级功能,比如负载均衡、伸缩、自动化应用程序部署等,可以帮助我们更加有效地管理容器化的应用程序。
二、K8s快速入门
1、环境准备
# 安装Minikube
curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 \
&& chmod +x minikube && sudo mv minikube /usr/local/bin/
# 安装Kubectl
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/
# 启动Minikube集群
minikube start
2、创建一个Deployment
# 创建一个Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
# 应用程序副本数
replicas: 3
selector:
# 匹配标签
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
# 镜像名称
image: nginx:1.14.2
ports:
- containerPort: 80
3、创建一个Service
# 创建一个Service
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
selector:
app: nginx
ports:
- name: http
port: 80
targetPort: 80
type: LoadBalancer
4、访问应用程序
kubectl get service nginx-service
# 输出类似如下内容
# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
# nginx-service LoadBalancer 10.0.142.100
80:30709/TCP 111s
# 访问 EXTERNAL-IP:80 即可访问应用程序
三、使用K8s进行自动化部署
1、使用Docker构建应用程序镜像
# 在应用程序根目录下创建一个名为 Dockerfile 的文件
# 编写Dockerfile,示例:
FROM node:12.13.0-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD [ "npm", "start" ]
# 构建镜像
docker build -t myapp:v1 .
2、使用Kubectl进行部署
# 创建一个Deployment
kubectl create deployment myapp --image=myapp:v1 --replicas=3
# 创建一个Service
kubectl expose deployment myapp --type=LoadBalancer --port=80
3、使用Helm进行自动化部署
# 安装Helm
curl https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3 | bash
# 添加一个Helm仓库
helm repo add stable https://charts.helm.sh/stable
# 安装一个Chart
helm install myapp stable/mysql
四、K8s的高级特性
1、自动伸缩
K8s可以根据资源利用率自动伸缩应用程序,让我们无需手动调整容器的数量。
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 3
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: myapp:v1
ports:
- containerPort: 80
resources:
requests:
cpu: 100m
memory: 100Mi
limits:
cpu: 500m
memory: 500Mi
---
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: myapp-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: myapp
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
2、服务发现和负载均衡
K8s可以自动发现容器,并且提供了负载均衡功能,让我们轻松地访问容器化的应用程序。
apiVersion: v1
kind: Service
metadata:
name: myapp
spec:
ports:
- name: http
port: 80
targetPort: 80
selector:
app: myapp
type: ClusterIP
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: myapp-ingress
spec:
backend:
serviceName: myapp
servicePort: 80
3、配置管理
K8s可以帮助我们轻松地管理应用程序的配置文件,让我们可以快速地更改应用程序的配置。
apiVersion: v1
kind: ConfigMap
metadata:
name: myapp-config
data:
DB_HOST: mydb
DB_USER: user
DB_PASSWORD: password
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
containers:
- name: myapp
image: myapp:v1
envFrom:
- configMapRef:
name: myapp-config
五、总结
K8s是一个功能强大、灵活性高的容器编排平台,在大规模容器化应用程序的部署和管理方面有着重要的作用。本文通过从容器和K8s、K8s快速入门、自动化部署、K8s的高级特性等几个方面详细阐述了K8s的相关知识,并给出了相应的代码示例,相信读者可以更加深入地了解K8s,并将其应用到实际的开发工作中。