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(
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>
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
|
Read help for GET command
|
Watch for changes
|
Sort Pod by age
|
Get Deployment YAML template w/o creating resource
|
Scale number of Pods
|
Filter resource with label selector
|
Attach to the specific container
|
tailing log file
|
update selector in service
|
Setup port forwarder to access the Pod directly
|
For JID
Case: target name is jid3-blue-release
List slowdown
|
Count slowdown
|
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