网站首页 > 博客文章 正文
2.6. Kubernetes介绍和使用
环境:
172.16.213.49 k8s-dev-master-1
172.16.213.59 k8s-dev-worker-1
172.16.213.57 k8s-dev-worker-2
2.6.1 k8s的基础单元Pod
2.6.1.1 pod特性
- pod是k8s 中最小的部署单元
- 一组容器的集合
- 拥有生命周期(导致ip地址不固定)
- 同一个pod中 共享存储、网络(网络协议栈 ip/mac/port,实现原理是 pod ip都绑定到一个叫infrastructure container的基础容器-pause, 实现应用程序网络共享)、命名空间
2.6.2 控制器Deployment
k8s中有很多控制器,通过控制器来创建pod,其中最常用的就是Deployment,简写deploy。
常用Pod控制器:
- Deployment (无状态应用)
- StatefuleSet(有状态应用)
- DaemonSet (保证每个节点只运行一份Pod 场景:glusterd/ceph/fluentd/logstash)kube-proxy
- ReplicaSet (副本)
- Job(跑批,一次性的任务)
- CronJob(加强版Job,定期运行,或者周期性运行)
针对本次的应用对应的deployment.yaml如下:
adxcreativeauditservice-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: adxcreativeauditservice-deployment
namespace: default
labels:
app: adxcreativeauditservice
spec:
replicas: 2
selector:
matchLabels:
app: adxcreativeauditservice
template:
metadata:
labels:
app: adxcreativeauditservice
spec:
containers:
- name: adxcreativeauditservice
image: reg.toutiao.com/hyhub/adxcreativeauditservice-rust:${branch}
2.6.3 service
2.6.3.1 service 与pod
由于pod的生命周期,当节点故障时,pod重新被创建后,ip会变化.service作用应运而生。
service 基于“标签选择器(key-value)”从集群中选择出一组pod对象,为这组pod对象提供固定IP地址。
原理:service与pod之间网络链接是kue-proxy通过在当前节点添加iptables DNAT
规则或ipvs规则,实现将流量调度给service根据标签选择器选出的pod对象。
2.6.3.2 service 与 coredns
k8s 通过core-dns为每个svc对象提供唯一的dns名称表示一级响应的dns资源记录,遵循标准:
svc.namespace.svc.cluster-domain格式。需要配置resolv.conf,增加cores svc的地址作为nameserver。
[root@k8s-dev-master-1 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
adxcreativeauditservice NodePort 10.244.100.228 <none> 8080:30633/TCP 4d
jenkins NodePort 10.244.65.157 <none> 8080:31197/TCP,50000:31506/TCP 3d22h
kubernetes ClusterIP 10.244.64.1 <none> 443/TCP 5d23h
CLUSTER-IP: 虚拟ip(Host Only),不可ping;
PORT: 前面是自己的端口,后端是node分配的随机端口;
踩坑1:
老版本k8s 使用kube-dns中出现一个问题就是 pod中无法解析域名,上面内部域名可以解析,所有外部域名都无法解析,后来发现都是转发给了core-dns 做内部解析了。原因为kube-dns Pod的 dnspolicy 为Default,而Default 默认pod会继承当前节点的resolv.con(ubuntu 18.04
/run/systemd/resolve/resolv.conf)f,解决办法 kubelet --resolv-conf 指定配置文件即可
curl jenkins.default.svc.cluster.local:8080
命令行创建service
kubectl create svc nodeport demo --tcp=80
#--tcp=<port>[:targetPort], 不指定targetPort默认容器端口与Service端口相同
Service 对象yaml模板
kind: Service
apiVersion: v1
metadata:
name: demoapp-svc
namespace: dev
spec:
selector:
app: demoapp
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
adxcreativeauditservice-service.yaml
kind: Service
apiVersion: v1
metadata:
name: adxcreativeauditservice-svc
labels:
app: adxcreativeauditservice
spec:
type: NodePort
selector:
app: adxcreativeauditservice
ports:
- name: http
protocol: TCP
port: 80
targetPort: 18989
nodePort: 32223
2.6.4 扩容、缩容
kubectl scale --replicas=3 -f adxcreativeauditservice-deployment.yaml
2.6.5 k8s 命令行
2.6.5.1 k8s 语法格式
kubectl [command] [TYPE] [NAME] [flags]
- COMMAND: 对资源操作的子命令,例如:get/create/delete/run
- TYPE: 要操作资源的类型,例如:pods/services;大小写敏感,支持使用单复数、简写;
- NAME: 要操作资源的对象名称,大小写敏感;不写默认当前名称空间所有对象;可通过TYPE/NAME格式 指定多个
- flags:命令行选线,比如-s 或者--server等; get等命令可以使用-o yaml|json|wide
2.6.5.2 常用操作
#创建、查看
kubectl create/apply -f xxx.yaml
kubectl get pods/svc -n namespace -o wide|json|yaml
kubectl get pods/svc -l k8s-app=kube-dns -n namespace -o wide|json|yaml
kubectl describe pods/svc/deploy -n namespace
kubectrl delete deploy、svc/xxx # 删除deployment 、service
#复制
kubectl copy namespace/containerid:/container dir/filename /xx/xx
#链接容器
kubectl exec -it containerid -n namespace /bin/bash
#在容器中执行命令
kubectl exec adxcreativeauditservice-deployment-7f5c9b9958-278nq -- ip addr
#log
kubectl logs -f podname、svc/svcname
# 更新资源
kubectl edit deploy/xxx_app
# 使用补丁修改、更新某个资源的字段
kubectl patch node/dev-k8s-worker-1 -p '{"spec":{"unschedulable":true}}'
#暂停
kubectl rollout pause deploy/xxx_app
kubectl rollout resume deploy/xxx_app
#回滚
#查看历史
kubectl rollout history deploy/xxx_app
#回滚
kubectl rollout undo deploy/xxx_app --to-revision=<version_index>
#集群管理
#设置不可调度
kubectl cordon dev-k8s-worker-1
#驱逐节点pods
kubectl drain --force --ignore-daemonsets dev-k8s-worker-1
#恢复调度
kubectl uncordon dev-k8s-worker-1
#查看k8s 支持的完整资源列表
kubectl api-resources
#k8s支持的api版本
kubectl api-versions
# 查看每种对象可嵌套使用的字段、数据类型级功能描述(支持三级字段获取)
kubectl explain deploy
kubectl explain deploy.metadata
kubectl get deploy demo -o yaml --export > deploy.yaml
2.6.6 k8s 存储卷
存储全分临时存储(emptyDir)、hostPath、网络存储,这里主直接说常用的几个网络存储
2.6.6.1 网络存储券 NFS
apiVersion: v1
kind: Pod
metadata:
name: volumes-nfs-demo
labels:
app: redis
spec:
containers:
- name: redis
image: redis:alpine
ports:
- containerPort: 6379
name: redisport
securityContext:
runAsUser: 888
volumeMounts:
- mountPath: /data
name: redisdata
volumes:
- name: redisdata
nfs:
server: 172.16.213.23
path: /data/jenkins_k8s
readOnly: false
2.6.6.2 网络存储券 GlusterFS
环境:
1.glusterFS创建一个能满足Pod资源数据存储需要的卷
2.k8s 各节点需要安装GlusterFS客户端(glusterfs/glusterfs-fuse)
apiVersion: v1
kind: Pod
metadata:
name: volumes-glusterfs-demo
labels:
app: redis
spec:
containers:
- name: redis
image: redis:alpine
ports:
- containerPort: 6379
name: redisport
volumeMounts:
- mountPath: /data
name: redisdata
volumes:
- name: redisdata
glusterfs:
endpoints: glusterfs-endpoints
path: kube-redis
readOnly: false
这里需要用到endpoints资源,所以glusterfs-endpoints需要手动创建一个Endpoints
apiVersion: v1
kind: Endpoints
metadata:
name: glusterfs-endpoints
subsets:
- addresses:
- ip: gf01.gluster
ports:
- port: 24007
name: glusterd
- addresses:
- ip: gf02.gluster
ports:
- port: 24007
name: glusterd
- addresses:
- ip: gf03.gluster
ports:
- port: 24007
name: glusterd
完成了docker、jenkins、harbor、k8s 相关配置后,可以配置go/grpc
来测试访问jenkins部署的项目
3. jenkins 构建,联调,访问
安装go/grpc
$ cd /usr/local/go/k8s-adxcreativeauditservice-rust
$ grpcurl -import-path ./proto -proto template.proto -plaintext -d '{"adxMediaName": "mgtv", "adxAdpId": "200042"}' 10.244.100.228:8080 templates.AdxAdpManagerService/getAdxAdpInfo
猜你喜欢
- 2025-05-11 idea整合dockerfile插件,打包镜像(docker环境可不安装)
- 2025-05-11 超详细!基于k8s+docker+jenkins的一站式 DevOps 环境搭建教程-下
- 2025-05-11 Kubernetes(K8s)+ GitLab + Jenkins 实现CI/CD
- 2025-05-11 docker的镜像和仓库(docker镜像仓库地址)
- 2025-05-11 轻量容器如何改变开发世界?Docker 基本概念与架构详解
- 2025-05-11 微服务时代,运维必须了解的那些事(服务架构演变)
- 2025-05-11 目前还能用的Docker容器加速方案和可用镜像源
- 2025-05-11 替代虚拟机的容器Docker安装教程——(Windows版)
- 2025-05-11 k8s系列-06-containerd的基本操作
- 2025-05-11 揭秘!GitLab CI/CD 配置的秘诀(gitlab ci trigger)
你 发表评论:
欢迎- 366℃用AI Agent治理微服务的复杂性问题|QCon
- 358℃初次使用IntelliJ IDEA新建Maven项目
- 355℃手把手教程「JavaWeb」优雅的SpringMvc+Mybatis整合之路
- 351℃Maven技术方案最全手册(mavena)
- 348℃安利Touch Bar 专属应用,让闲置的Touch Bar活跃起来!
- 346℃InfoQ 2024 年趋势报告:架构篇(infoq+2024+年趋势报告:架构篇分析)
- 344℃IntelliJ IDEA 2018版本和2022版本创建 Maven 项目对比
- 342℃从头搭建 IntelliJ IDEA 环境(intellij idea建包)
- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)