K8S入门以及应用场景
k8s入门以及实际开发过程中的使用介绍
一、容器是什么?
容器镜像是轻量的、可执行的独立软件包 ,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置,赋予了软件独立性,使其免受外在环境差异(例如,开发和预演环境的差异)的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突。
一句话概括容器:容器就是将软件打包成标准化单元,以用于开发、交付和部署。
从虚拟化层面来看,传统虚拟化技术是对硬件资源的虚拟,容器技术则是对进程的虚拟,从而可提供更轻量级的虚拟化,实现进程和资源的隔离。
二、docker
docker就是一种轻量化的虚拟化容器技术,它的目标是应用组件级别的“一次封装,到处运行”。这里的应用组件,既可以是一个Web应用,也可以是一套数据库服务,甚至是一个操作系统。将应用运行在Docker 容器上,可以实现跨平台,跨服务器,只需一次配置准备好相关的应用环境,即可实现到处运行,保证研发和生产环境的一致性,解决了应用和运行环境的兼容性问题,从而极大提升了部署效率,减少故障的可能性。
以docker发布java服务为例
(1)编写Dockerfile文件
FROM java:8
ADD demo-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 9527
ENTRYPOINT ["java", "-jar", "app.jar", "--server.port=9527"]
(2)生成镜像
将jar包和Dockerfile放在同一文件夹下,执行命令docker build -t mydemo .
(2)运行容器(实例化)
docker run -p 9527:9527 镜像名
(3)上传镜像到镜像仓库(统一管理方便获取)
docker tag mydemo registry.cn-shanghai.aliyuncs.com/xxx/mydemo:v1
docker push registry.cn-shanghai.aliyuncs.com/xxx/mydemo:v1
常用命令:
docker images (查看镜像)
docker rmi 镜像名 (删除镜像)
docker ps (查看容器)
docker logs 容器名 (查看容器日志)
docker exec -it 容器名 bash (进入容器)
docker stop 容器名 (关闭容器)
docker start 容器名 (启动容器)
docker rm 容器名 (删除容器)
随着服务的增长使用docker会有什么问题?
-
容器的手动操作成本变大,启动,停止,扩容变的困难。
-
服务数量的增长导致服务器数量的增长,资源分配复杂。
三、k8s
Kubernetes是容器集群管理系统,是一个开源的平台,具有完备的集群管理能力,包括多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和服务发现机制、内建智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制,以及多粒度的资源配额管理能力。
(1)创建pod
pod创建一般通过资源控制器完成,k8s提供了一系列的控制器,比如ReplicaSet、Deployment和DaemonSet等,这里主要讲下Deployment的使用。
①创建yml文件,内容指定容器镜像,副本数等主要信息。
apiVersion: apps/v1
kind: Deployment
metadata:
name: mydemo
spec:
selector:
matchLabels:
app: mydemo
replicas: 2
template:
metadata:
labels:
app: mydemo
spec:
containers:
- name: mydemo
image: registry.cn-shanghai.aliyuncs.com/xxx/mydemo:v1
ports:
- containerPort: 9527
②执行命令(ljw-demo 是自定义命名空间)
kubectl apply -f mydemo.yml 通过yml配置创建pod
kubectl delete -f mydemo.yml
kubectl get pod -n ljw-demo 查看特定命名空间下的pod
kubectl describe pod mydemo-bd55cd8dd-c7wkq -n ljw-demo 查看某个pod的详细情况
kubectl delete pod mydemo-bd55cd8dd-c7wkq -n ljw-demo 删除某个pod
(2)创建service
pod往往不会单独存在,需要搭配对应的service使用,service为一组pod提供对外服务的能力。
①ClusterIP类型
apiVersion: v1
kind: Service
metadata:
name: mydemo-service
namespace: ljw-demo
labels:
app: mydemo
spec:
ports:
- port: 9527
targetPort: 9527
protocol: TCP
selector:
app: mydemo
②NodePort类型
可以在外部通过nodeip:nodePort访问服务,缺点是在各个节点都开启了端口,不安全且不好管理,并且只能做四层代理,现实中往往需要七层代理。
apiVersion: v1
kind: Service
metadata:
name: mydemo-svc
namespace: ljw-demo
spec:
type: NodePort // 配置为NodePort,外部可以访问
ports:
- port: 9527 // 容器间,服务调用的端口
targetPort: 9527 // 容器暴露的端口,与Dockerfile暴露端口保持一致
nodePort: 39528 // NodePort,外部访问的端口
selector:
app: mydemo
创建命令
kubectl apply -f mydemo-svc.yml 通过yml配置创建pod
kubectl delete -f mydemo.yml
kubectl get svc -n ljw-demo 查看命令空间下的所有service
kubectl describe svc 服务名 -n ljw-demo
service的NodePort存在的不足
1、一个端口只能一个服务使用,端口需要提前规划
2、只支持4层网络协议
四层(传输层):基于ip和端口转发的
七层(应用层):基于应用层协议转发,例如http、可以根据域名、url等转发
(3)ingress controller和ingress
ingress controller可以简单理解成nginx服务,ingress可以理解为nginx的一段配置,一个ingress对应nginx里的一个server配置文件。
编写yml文件
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: mydemo-ing
namespace: ljw-demo
annotations:
kubernetes.io/ingress.class: "nginx"
spec:
backend:
serviceName: mydemo-service
servicePort: 9527
rules:
- host: demo.hundun.com
http:
paths:
- path: /
backend:
serviceName: mydemo-service
servicePort: 9527
四、argocd
Argo CD 是一个为 Kubernetes 而生的,遵循声明式 GitOps 理念的持续部署(CD)工具,它的配置和使用非常简单,并且自带一个简单易用的 Dashboard 页面,并且支持多种配置管理/模板工具(例如 Kustomize、Helm、Ksonnet、Jsonnet、plain-YAML)。
Argo CD 被实现为一个 Kubernetes 控制器,它持续监控正在运行的应用程序并将当前的实时状态与所需的目标状态(例如 Git 仓库中的配置)进行比较,在 Git 仓库更改时自动同步和部署应用程序。
更多推荐
所有评论(0)