k8s kubernetes

本文深入探讨Kubernetes的核心概念,如Pod、Service、Deployment,以及如何在GCP上搭建Kubernetes集群。涵盖Kubernetes的网络模型、健康检查机制、Ingress配置、kubectl命令实践,还有如何使用Kustomize进行高效的资源管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

k8s学习资料:

https://www.kubernetes.org.cn/docs

https://baijiahao.baidu.com/s?id=1602795888204860650&wfr=spider&for=pc

http://https://kubernetes.io/docs/setup/turnkey/gce/

k8s的官方教程 及文档  https://kubernetes.io/docs/concepts/

 

 

gcp上搭建k8s:https://kubernetes.io/docs/setup/turnkey/gce/

本地搭建k8s:https://kubernetes.io/docs/setup/turnkey/gce/

 

案例:在gcp的k8s上搭建vault应用,vault是一款密码等敏感信息管理工具:

资源:

1.使用terraform部署vault到gcp上,从创建一个项目开始:https://github.com/sethvargo/vault-on-gke/tree/master/terraform

过程中的疑问:

1.gcp上的项目的作用?

2.为什么要依赖apis?

3.各种subnets

4.VPC的作用:作为平台上网络连通的基础组件,可以分配给VM,容器管理平台的容器等,相当于分配一个内部的ip。一个项目下可以有多个VPC,,每个VPC可以跨很多个区,每个VPC含有好多个subnet,每个subnet针对一个区

 

k8s内容器绑定同步存储:

1.gcp:首先在yaml内的container下配置mountpath和gcp_bucket_name.然后在kubctl app的时候就会mount

 

学习中的问题:

1.gcp上的k8s和vpc的关系?是建立在vpc内?

2.kubernetes的网络:https://medium.com/google-cloud/understanding-kubernetes-networking-pods-7117dd28727

 

GCP上的k8s:

概念:http://www.hangge.com/blog/cache/detail_2428.html

1.cluster:master和node的集群,k8s的最大单元

2.master和node上的组件:

master: 

2.workload:k8s的pod,一个pod对应一个微服务的应用。pod内加载container

3.service:pod的链路方式,被调用的入口的定义,比如指定哪个loadbalance,master通过这个东东知道访问是转给哪个pod的

4.namespace: 也叫network namespace,是linux上的一种隔离的虚拟网络空间,用于虚拟机或者容器的网络,这是个十分重要的概念,namespace是一种隔离机制,当集群用户很小时,可以使用默认的namespace 叫做default,但是当集群较大时,最好创建一些namespace,比如每个project一个。平时的namespace是default,所以在使用kubectl的时候可以不指定namespace,但是如果定义了新的namespace,怎么指定?https://blog.youkuaiyun.com/ouyangtianhan/article/details/85107967

生成个namespace(

  1. kubectl apply -f pod.yaml --namespace=test

指定后再执行kubectl到这个pod里时就得指定namespace。命令行如下:

kubectl get pods --namespace=test

 

 

https://blog.youkuaiyun.com/u012707739/article/details/78163354

 

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

kubernetes指南学习总结:

kubernetes组件及结构: https://feisky.gitbooks.io/kubernetes/components/

workload:指pod,比如deployment类型或者是replicaset类型

etcd:提前安装,这个是存储kuberctl的各种资源的状态的

service是核心概念,通信都是基于socket

endpoint:ip+port点   cluster ip+ service port

replication controller:通过yaml文件配置的一个控制器,用来管理pod数量和启动

deployment:与replication controller相似度90%,甚至可以认为是其的升级功能,从1.2版本开始的

service:定义了该服务的端口和ip,会临时得到一个clusterip。

label:用于识别哪个pod

lebles:非常重要,在yaml中的labels下定义了哪些label,这个资源就可以通过label名称被搜索到,是一种key/value的形式,label可以有无限个,key可以定义为任何。。。

selector:对应label的一个概念,在yaml中使用selector来筛选过滤,可以使用基本的判断语句,比如and !等

滚动升级:在升级过程中,不是所有的pod全部同时停掉并更换为新的的镜像,而是逐个的停止和启动

一个早期原始的简单的demo:tomcat+mysql

步骤:

1.单击部署一个kubernetes,需要etcd,然后一顿启动,此处参考相关文章或指南

2.创建一个mysql的 rc(replication controller),用于启动和控制pod的数量,具体办法:写一个yaml,找一个replication的现成yaml参考语法,然后用kuberctl create 一下,然后查看这个rc是否创建成功,然后查看下容器是否启动;

3.创建一个mysql的service。用来把容器变成一个服务。具体方法也是先有一个yaml文件,kind是service,然后kuberctl create一下。

4.同上2,3办法创建tomcat的pod。在service里已配置了mysql的访问。

5.这个集群就打好了

 

关于node,一个集群首先要配置一堆的node等待使用,node的准备过程是先安装一堆的程序比如kubelet,启动kuberlete时主动向kuberserver报到并注册。

 

不同的ip:

pod ip:被随机分配的一个不固定的ip,临时的,不稳定。一般不取

cluster ip(service ip):固定ip,每一个service对应一个ip。具体可以见gcp文

 

当使用k8s部署一个容器应用时,对外访问的方式,可以使用pod(有一个ip和port),还可以使用service,还可以使用nodeport(),这三个首推service的方式

 

 

 

命令:

1.kubectl describe pod xxxx   查看pod的问题,用于debug或者排查问题,这个命令会读取kuber自带的event的内容

2.kubectl scale rc xxxpod  --replicas=3      更改scal的pod数量为3

 

ingress,k8s自带ingress。这个ingress是由ingress controller管理的。这个controller是自带的且自动启动。一个ingress可以根据端口和各种因素配置多个域名,即多个http对应多个不同的条件

 

service的本质:k8s给每个service配了一个ip,即cluster ip,kuber-proxy

kubectl create -f xxx.yaml,这个yaml内是一个service的kind,执行后即创建了映射

k8s的网络,描述的比较清晰的:k8s指南第46页:

pod ip的实质,是通过node ip的转发实现的。k8s的一切通信实际都源于node ip,即node

service ip(cluster ip),是k8s分配的,且在k8s内是唯一的,不像pod ip,可能是在不通的node上有相同的ip(因为pod ip是node分配的局域网段),service ip刚开始是不能被直接ping的,因为是k8s虚拟的ip,甚至不是一种ip

 

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

k8s学习之yaml文件篇:https://kubernetes.io/docs/concepts/configuration/

学习总结:

1.最好不单独定义pod,绑定到repli或者是deployment上,其中更倾向于使用deployment

2.service要在创建pod之前创建。

3.

 

 

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

k8s secret 和 configmap   https://www.kubernetes.org.cn/3400.html   https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/#adding-configmap-data-to-a-volume

应用场景:配置和应用分开的方式, k8s中有一个kind,叫secret或者configmap,这个是作为应用即service的全局配置文件,每次修改这个配置即可修改应用

创建方式:使用kubctl create直接创建和从文件创建

$ kubectl create configmap my-config --from-literal=key1=value1 --from-literal=key2=value2
$ kubectl create -f myconfigmap.yaml

使用:两种方式      通过env或者通过volume。通过env即在container内配置env

secret和 configmap类似,唯一的区别是获取的时候拿到的不是值,而是字符长度。secret存储的时候使用base64进行加密

....
 containers:
      - name: rsvp-app
        image: teamcloudyuga/rsvpapp
        env:
        - name: MONGODB_HOST
          value: mongodb
        - name: TEXT1
          valueFrom:
            configMapKeyRef:
              name: customer1
              key: TEXT1
        - name: TEXT2
          valueFrom:
            configMapKeyRef:
              name: customer1
              key: TEXT2
        - name: COMPANY
          valueFrom:
            configMapKeyRef:
              name: customer1
              key: COMPANY
apiVersion: v1
kind: Pod
metadata:
  name: dapi-test-pod
spec:
  containers:
    - name: test-container
      image: k8s.gcr.io/busybox
      command: [ "/bin/sh", "-c", "ls /etc/config/" ]
      volumeMounts:
      - name: config-volume
        mountPath: /etc/config
  volumes:
    - name: config-volume
      configMap:
        # Provide the name of the ConfigMap containing the files you want
        # to add to the container
        name: special-config
  restartPolicy: Never

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

k8s健康检查(通过设定的动作检查k8s内的应用的状态和服务连接状态)    livenessProbe和readinessProbe        https://blog.youkuaiyun.com/asdf57847225/article/details/78269506  

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

k8s基本使用案例: vault部署到gke上  https://github.com/sethvargo/vault-on-gke

 

》》》》》》》》》》》》》》》》》》》》》》》》》》》》》

从kubectl进入到container里的命令:

kubectl exec -it podName  -c  containerName -n namespace -- shell comand

 

》》》》》》》》》》》》》》》》

kaniko:一个可以不使用docker daemon就可以生成镜像并上传到库里的工具。

>>>>>>>>>>>>>>>

configmap secret

kustomize 引入configmap等    https://blog.youkuaiyun.com/liukuan73/article/details/79492374

 

>>>>>>>>

安装k8s,然后从另一台机器登陆或者从本机登陆。kubectl 

kubectl get pods 获取pods。

kubectl exec -it pod的name /bin/bash或者sh  互动式进入到pod内,即进入到container内。然后可以查看

kubectl config view 查看当前k8s的配置。比如yaml里那些东东

kubectl describe pod/pod的名称 -n namespace的名称       查看该namespace下所有的pods

 

 

/home/jenkins/tools/kubernetes/kubectl-1.9.6/kubectl --server='https://dev.zedm2.dev.jp.local' --token=${K8S_TOKEN} --insecure-skip-tls-verify=true --namespace=esd-membership-dqs create secret generic tt --from-file=./david.txt

 

有用的命令:  https://blog.youkuaiyun.com/liumiaocn/article/details/73913597

kubectl pod xxxxpod名 即可查看pod下的container的详细信息

kubectl describe pod 查看pod的状态和日志

kubectl logs pod名称 会报错

kubectl logs pod名称 -c 容器名称 查看容器的日志

查看pod的yaml文件

kubectl delete pod xxxxx删除pod,删除掉后还会重启一个新的。(kubectl get po  pod的name  -o yaml 这个命令可以查看pod的配置文件)

kubectl delete deployment xxxx删除deployments,即把一个pod的workload干掉,即部署单元。就是该pod的根程序(kubectl get deployments 就可以查找到所有的deployments)

kubectl describe po xxxxpod的name,查看这个pod的所有的信息

各种删除:

kubectl delete Ingress xxxx(这个ingress是怎么获取的?kubectl get ingress) 

 

kustomize: kubernetes中用来生成最终yaml执行文件的。为啥要最终?就是把共性的yaml片段提炼出来,然后根据特性编写各个环境的yaml文件,这些文件的目录格式和语法按照kustomize编写,然后kustomize build 即可把这些文件整合到一个大的最终过的yaml中去,即提炼基础资源,再在不同的环境的目录中分别配置。大概就这意思。核心功能:build的时候生成一个最终执行的yaml文件。https://github.com/kubernetes-sigs/kustomize

 

》〉》〉》〉》〉》〉》〉》〉》〉》〉》〉》〉》〉》〉》〉

kubernetes 结合 traefik ingress实现访问入口

https://blog.51cto.com/icenycmh/2124502

>>>>>>>>>>>>>>>

当前案例整理,完全私有云,自己部署kubenetes:

整体架构:本地server+kubernetes

 

kubernetes 使用kustomize大法:整理如下:kubernetes是1.14后支持这个功能的,目前最新是1.15版本,rt这个私有云真tmd先进

  >>>>>>>>>>>>>>

 

kubetl命令经验总结:

kubectl可以干的事有:

1.从本地复制文件到pod内

kubectl cp xxxfile podname:path 类似于 scp把本地文件复制到另一个server上。可以直接复制的,这个是 新发现的功能。复制到非默认的pod的路径下应该如何配置container的name????留下这个疑问??

使用这个命令:  kubectl cp <file-spec-src> <file-spec-dest> -c <specific-container>

请参考:https://medium.com/@nnilesh7756/copy-directories-and-files-to-and-from-kubernetes-container-pod-19612fa74660

2.直接编辑部署的.yaml

kubectl最牛逼的地方就在于可以直接编辑deployment.yaml,保存后会直接改变deployment.yaml并重启pod。注意:有时候保存的时候会保错误,比如vi erro之类的。这个时候再edit,再保存就ok了,原因?鬼他妈的知道。这是一个bug,知道怎么用就ok了。

编辑deploymnet.yaml提供了一个渠道,可以直接更改配置而不需要重新通过job进行部署和变更或者重启。比如想更换一个镜像,只需要修改yaml中的image的路径即可。在某些公司edit的权限可能必须是admin。(提到这里,说一下kubectl 的执行权限,分查看级,执行级以及修改。即增删改查四级)

有哪些情况可以重启kubectl?????1.干掉pod(kubectl delete pod xxxxx).2.修改部署用的yaml(kubectl edit deployment xxxxdeployment's name)。

kubectl 定位问题的几个思路:

1.kubectl describe xxxx  这个xxxx可以指pod 加pod的名称或者 deployment加deployment的名称 或者service 加service的名称等等等等很多。能查看到所有的pod启动过程中的状态以及所有的container的状态。

2.kubectl log 可以查看container启动过程的历史

3.kubectl exec -it  podname -c container sh 这个可以登陆到container内部查看container内的application 自己的日志

4.kubectl get xxx 这个xxx可以是pod, deployment,service, ing(后者ingress)。可以使用过滤符,比如grep xxx

5.kubectl get ing 可以拿到这个service对应的url。

总结一点最重要的命令:kubectl edit deployment xxx。直接编辑yaml,保存后自动重启pod。切记

问题来了:如果edit后面加了deployment,那么是不是还可以修改别的?比如configmap或者service或者ingress?????

 

经验总结2: 如果保持pod启动不被重启,然后在container任意操作???禁止重启pod:

具体实现方法: 首先使用kubectl edit 编辑yaml文件或者在开发yaml的时候设置好。原理都是在yaml内设置参数。其次删掉健康检查,比如readiness和liveness。第三也是最重要的,增加一个command: ["tail"] args: ["-f","/dev/null"],这是两行命令:

command: ["tail"]

args: ["-f","/dev/null"]

这两行加在哪里?家在与images并列的行即可。

加完后,当再次查看这个deployment的时候会发现没有了command那两行,但是多了command和args的多行配置在对应的container下。牛逼的kubernetes

查看namespace里有多少个service,ingress,deploymnet等等数量,而不是查看cpu的占用。命令是kubectl describe resourcequota

 

 

knowledge from training video of kubernetes:

1.     4 basic components of kubernetes: api server,schedular,controller manager(node controller,replication controller,service account and token controllers),etcd(狠角色,储存所有的资源的状态)

 

 

Common

Read help

$ kubectl --help

Read help for GET command

$ kubectl get --help

Watch for changes

$ kubectl get po -w

Sort Pod by age

$ kubectl get po --sort-by=.status.startTime

Get Deployment YAML template w/o creating resource

$ kubectl create deploy nginx --image=nginx:1.15.10-alpine --dry-run -o yaml

Scale number of Pods

$ kubectl scale --replicas=2 deploy/addressbook-api-beta

Filter resource with label selector

$ kubectl get svc -l 'canaryname=jid3-release'

NAME                 TYPE       CLUSTER-IP   EXTERNAL-IP   PORT(S)                                   AGE

jid3-blue-release    NodePort   10.3.0.11    <none>        81:20572/TCP,80:9349/TCP,8080:11046/TCP   85d

jid3-green-release   NodePort   10.3.0.76    <none>        81:13849/TCP,80:1527/TCP,8080:32559/TCP   85d

 

 

$ kubectl get svc -l 'canaryname=jid3-release,canary=false'

NAME                TYPE       CLUSTER-IP   EXTERNAL-IP   PORT(S)                                   AGE

jid3-blue-release   NodePort   10.3.0.11    <none>        81:20572/TCP,80:9349/TCP,8080:11046/TCP   85d

Attach to the specific container

$ kubectl exec -it traefik-jid3-release-6fc496796f-cnf9r -c traefik-jid3 -- /bin/sh

tailing log file

$ kubectl exec -it traefik-jid3-release-6fc496796f-cnf9r -c traefik-jid3 -- tail -f /var/log/access.log

update selector in service

$ kubectl patch svc ingress-nginx --patch='{"spec":{"selector":{"app": "nginx-ingress-lb"}}}'

Setup port forwarder to access the Pod directly

$ kubectl port-forward anomaly-sentinel-pre-79d7dfd7c8-4tlxm :80

 

For JID

Case: target name is jid3-blue-release

List slowdown

$ kubectl get po -l name=jid3-blue-release -o name | cut -d/ -f2 | xargs -I{} kubectl exec -t {} -c jid3-tomcat8 -- cat logs/slowdown.log | sort

Count slowdown

$ kubectl get po -l name=jid3-blue-release -o name | cut -d/ -f2 | xargs -I{} kubectl exec -t {} -c jid3-tomcat8 -- cat logs/slowdown.log | wc -l

Edit Edit

 

kubernetes通过api执行,而不是使用命令行:https://docs.okd.io/latest/rest_api/apis-extensions/v1beta1.Deployment.html#Post-apis-extensions-v1beta1-deployments

比如更新一个deployment 

$ curl -k \
    -X PUT \
    -d @- \
    -H "Authorization: Bearer $TOKEN" \
    -H 'Accept: application/json' \
    -H 'Content-Type: application/json' \
    https://$ENDPOINT/apis/extensions/v1beta1/namespaces/$NAMESPACE/deployments/$NAME <<'EOF'
{
  "kind": "Deployment",
  "apiVersion": "extensions/v1beta1",
  ...
}
EOF

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值