k8s一次应用的创建
k8s 简介
Kubernetes简述
Kubernetes是容器集群管理系统,是一个开源的平台,可以实现容器集群的自动化部署、自动扩缩容、维护等功能。
通过Kubernetes你可以:
- 快速部署应用
- 快速拓展应用
- 快速对接新的应用功能
- 节省资源(分时共享下)
k8s总体结构
k8s master 组件
master: 集群的控制节点,负责对集群中所有资源进行管控和调度,它上面运行了etcd,
api-server , controller-manager 和 schedule 等系统组件。
api-server 各类资源的api接口,数据中心
controller-manager 各种controller的管理者,是集群内部的管理控制中心(如Node Controller
Replication Controller,Endpoints Controller,Service Account &
Token Controllers)
schedule k8s集群的调度器,主要的任务是监控所有新创建尚未分配到节点上的Pod
根据调度规则,选择一个合适的节点去运行。
etcd 存储各种资源对象,支持一致性和高可用的键值对存储组件
k8s node 组件
Node 组件运行在每一个节点上(包括 master 节点和 worker 节点),
负责维护运行中的 Pod 并提供 k8s 运行时环境
(1)kubelet:在API Server上注册节点信息,定期向Master汇报节点资源使用情况,
确保 Pod 中的容器处于运行状态,是Node上的pod管家
(2)kube-proxy: 是一个网络代理程序,运行在集群中的每一个节点上,服务访问,负载均衡,
是实现 k8s Service 的重要部分。在节点上维护网络规则,应用可以在集群内、
集群外正确地与 Pod 进行网络通信。
(3)容器引擎 docker: 创建并运行容器
k8s addons (其他的插件)
网络cni插件: calico flannel等
dns插件: coredns等
代理服务插件: ingress traefik等
监控和日志: metrics-server prometheus node-exporter grafana kube-state-metrics等
应用快速入门
获取资源
命令 kubectl get <资源名称>
帮助 kubectl get -help
使用 kubectl api-resources 获取支持资源的完整列表。
获取node资源:
kubectl get node
参数:
- -o wide 输出格式,常用格式: json | yaml | wide ;
- -w 监控输出结果,类似tail命令的-f选项;
- --show-labels 显示标签;
获取资源的详细信息
kubectl describe node ${nodename}
获取集群信息
手动部署一个应用
1.手动创建一个控制器 deployment
(1.1) 使用 kubectl 创建一个deployment (kubectl 请求 api-server的api进行创建)
kubectl run nginx-deploy --image=nginx:1.14-alpine --replicas=1 --port=80 -ntest
参数
nginx-deploy 对应的是 deployment 的 name
--image=nginx:1.14-alpine 对应的是使用的镜像为nginx:1.14-alpine
--replicas=1 实例对应的是副本数 1
--port=80 容器内的应用端口为 80
-ntest 指定'test' 租户
--restart='Always': [Always, OnFailure, Never] pod的策略,遇到问题重启,默认是Always
...
(1.2) 使用 yaml 文件创建一个deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deploy
namespace: test
labels:
run: nginx-deploy
spec:
replicas: 1
selector:
matchLabels:
run: nginx-deploy
template:
metadata:
labels:
run: nginx-deploy
spec:
containers:
- name: nginx
image: nginx:1.14-alpine
ports:
- containerPort: 80
执行yaml文件: kubectl apply -f nginx.yaml
(2)查看 deployment 列表
(3) 查看 ReplicaSet 副本控制器
(4) 控制器被创建后,然后创建相应的 pod
(5) 通过 pod ip 访问 容器中的nginx服务
2.创建一个service
Kubernetes中一个应用服务会有一个或多个实例(Pod),每个实例(Pod)的IP地址由网络插件动态随机分配。service 资源 屏蔽了这些后端实例的动态变化和对多实例的负载均衡。
(1.1) 使用bebectl 创建一个service
deployment nginx-deploy 指定deployment 资源,并且名称为nginx-deploy
--port service暴露的端口
--target-port 容器内的目标端口
--protocol 协议类型 tcp udp
--type=ClusterIP service的类型 ClusterIP, NodePort, LoadBalancer, or ExternalName
(1.2) yaml 创建
apiVersion: v1
kind: Service
metadata:
labels:
run: nginx-deploy
name: nginx-deploy
namespace: test
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
selector:
run: nginx-deploy
执行yaml文件: kubectl apply -f nginx-svc.yaml
(2) 获取 service 列表
通过 service IP 访问 nginx 应用
(3) 启动一个其他的应用,通过service name 去访问
kubectl run other-cli -it --image=busybox --replicas=1 --restart=Never -ntest
wget nginx-deploy
(4)跨命名空间访问 应用
{服务名}.{命名空间}.svc.cluster.local
wget nginx-deploy.test.svc.cluster.local
3.动态扩容,缩容pod副本
(1)先创建一个应用,副本数为2
kubectl run nginx-test --image=nginx:1.14-alpine --replicas=2 --port=80 -ntest
(2)查看应用
(3)为应用创建 service
kubectl expose deployment nginx-test --name=nginx-test --port=80 -ntest
(4)查看service服务
endpoint 资源是通过service自动生成的
endpoint 信息发现有两个 pod 的ip信息,故svc资源可以做负载均衡,访问service name或者cluster ip 均会负载到两个ip上
(5)将应用实例扩容为5个。
kubectl scale deployment nginx-test --replicas=5 -ntest
(6)查看pod和svc信息
(7)将应用缩容为 3 个
kubectl scale deployment nginx-test --replicas=3 -ntest
4.滚动更新
(1)升级nginx-test 的镜像版本 nginx:1.14.2
kubectl set image deployment nginx-test nginx-test=nginx:1.14.2 -ntest
(2)查看 滚动更新的状态
(3)查看pod内镜像版本
kubectl describe po nginx-test-7bf5988765-bh57f -ntest
5.动态回滚
默认回滚至上一版本
kubectl rollout undo deployment nginx-test -ntest
6.集群外部访问应用
修改service 的类型 为nodeport 即可
(1)查看 修改后 service 类型
在集群中每个节点上都会开启一个30171端口(这个端口是随机生成的),
映射到K8S集群的nginx-test service的80端口。可自行在其它节点验证。
可在任意的k8s节点通过 netstat -tunlp 查询到此端口。
(2)也可通过 Ingress 和 traefik 配置ingress资源进行访问。