Kubernetes四探(官网Tutorials的学习)

5 篇文章 0 订阅

2022年10月2日:
国庆是充电的好机会。继续学习官网的Tutorials。
先推荐一个学习kubernetes 的好去处。
https://labs.play-with-k8s.com
就是有点慢,其他都非常不错。学习的一个很大的阻碍就在于解决各种访问不通的问题(比如一些仓库 registry.k8s.io 访问不了··那好多教程都没法实践了),在play with k8s 中,就不用纠结这个问题了,官方的很多教程也可以实现了,而且很容易创建多个instance,还想啥,上吧!

这里记录下学习遇到的问题,解决方法,以及不足

1、Basics 上一回就学习了

2、Configuration

// 访问不了
Example: Configuring a Java Microservice
// configMap的使用,易懂
Configuring Redis using a ConfigMap

3、Stateless Applications

// service的四种类型
// ClusterIP: Exposes the Service on a cluster-internal IP. Choosing this value makes the Service only reachable from within the cluster. This is the default ServiceType.
// NodePort: Exposes the Service on each Node's IP at a static port (the NodePort). A ClusterIP Service, to which the NodePort Service routes, is automatically created. You'll be able to contact the NodePort Service, from outside the cluster, by requesting <NodeIP>:<NodePort>.
// LoadBalancer: Exposes the Service externally using a cloud provider's load balancer. NodePort and ClusterIP Services, to which the external load balancer routes, are automatically created.
// ExternalName: Maps the Service to the contents of the externalName field (e.g. foo.bar.example.com), by returning a CNAME record with its value. No proxying of any kind is set up.

// LoadBalancer
Exposing an External IP Address to Access an Application in a Cluster
// 默认就是 ClusterIP
// 使用kubectl port-forward svc/frontend 8080:80  转发
Example: Deploying PHP Guestbook application with Redis

4、Stateful Applications

昨天 今天 学习了 StatefulSet Basics,获益匪浅,因为很多应用都是stateful的,所以这个当然重点学习。
学习的过程中就像图的深度遍历算法一样,一个知识点 关联着另一个知识点。
另外,这个东西涉及很多计算机网络、文件系统等底层的基础知识。
这也是除了墙之外的,学习k8s的一大阻碍。当然,跨过去,就是新的天地!

深入地看了:
Pods
Cluster DNS
Headless Services
PersistentVolumes
PersistentVolume Provisioning
StatefulSets
这几个概念。获益匪浅啊

// 笔记
// 很有用 了解了很多k8s的基础知识
// SRV records CNAME  A record 很多DNS的名词 需要了解
// https://blog.csdn.net/JakeMa1024/article/details/111549865

// 如何 dynamically provision PersistentVolumes.
// https://kubernetes.io/docs/concepts/storage/persistent-volumes/
// 设置default StorageClass 即可,如何设置呢
// setting the annotation storageclass.kubernetes.io/is-default-class equal to true in a StorageClass object

//两种情况 admission plugin 是否开启 
// 用 Admission Controllers 设置 DefaultStorageClass 
// Feature Gates 里开启RetroactiveDefaultStorageClass

https://kubernetes.io/docs/concepts/storage/dynamic-provisioning/
Dynamic provisioning can be enabled on a cluster such that all claims are dynamically provisioned if no storage class is specified. A cluster administrator can enable this behavior by:

* Marking one StorageClass object as default;
* Making sure that the DefaultStorageClass admission controller is enabled on the API server.

// 例如:指定default StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: slow
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-standard
  
// 再创建pv
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv1
  labels:
    type: local
spec:
  storageClassName: slow
  capacity:
    storage: 2Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data1"
  
// 或者用patch
kubectl patch storageclass pv_name -p '{"metadata": 
  {"annotations": {"storageclass.kubernetes.io/is-default-class": "true"}}}'
  
// 然后enable DefaultStorageClass
kube-apiserver --enable-admission-plugins=DefaultStorageClass
kube-apiserver -h | grep enable-admission-plugins

// 报 找不到 kube-apiserver
//百度说 修改/etc/kubernetes/manifests/kube-apiserver.yaml 文件,修改后 会重启
// 并且增加了kube-scheduler-node1 和kube-controller-manager-node1 pod

// 查询 StorageClass 
kubectl get sc
kubectl get sc standard -o yaml
// 我目前是手动创建的pv
StatefulSet Basics
// 下面三个还没有学
Example: WordPress and MySQL with Persistent Volumes
Example: Deploying Cassandra with Stateful Sets
Running ZooKeeper, A CP Distributed System

遇到的问题:
问题1、StatefulSet Basics 中,需要集群开启dynamically provision PersistentVolumes。how?
答:
链接:https://kubernetes.io/docs/concepts/storage/dynamic-provisioning/

Dynamic provisioning can be enabled on a cluster such that all claims are dynamically provisioned if no storage class is specified. A cluster administrator can enable this behavior by:

  • Marking one StorageClass object as default;
  • Making sure that the DefaultStorageClass admission controller is enabled on the API server.

所以首先要有默认的StorageClass

// 例如:指定default StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: slow
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-standard

// 或者用patch把已有的storageclass 设为默认
kubectl patch storageclass pv_name -p '{"metadata": 
  {"annotations": {"storageclass.kubernetes.io/is-default-class": "true"}}}'

然后在api-server中 enable DefaultStorageClass
官网上说运行命令:

kube-apiserver --enable-admission-plugins=DefaultStorageClass
kube-apiserver -h | grep enable-admission-plugins

但是我压根没有kube-apiserver这个命令,所以修改/etc/kubernetes/manifests/kube-apiserver.yaml 文件,然后集群会自动重启,并且增加了kube-scheduler-node1 和kube-controller-manager-node1 pod。

最后创建一个pv

// 再创建pv
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv1
  labels:
    type: local
spec:
  storageClassName: slow
  capacity:
    storage: 2Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/mnt/data1"

然后,再创建pvc (PersistentVolumeClaim)就会自动挂载到pv上。

问题2:taint node

Warning  FailedScheduling  21s   default-scheduler  0/1 nodes are available: 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate

解决:

// 查看都是什么污点
kubectl get no -o yaml | grep taint -A 5

  spec:
    podCIDR: 10.5.0.0/24
    podCIDRs:
    - 10.5.0.0/24
    taints:
    - effect: NoSchedule
      key: node-role.kubernetes.io/master
    - effect: NoSchedule
      key: node.kubernetes.io/disk-pressure
      timeAdded: "2022-10-02T02:33:26Z"
	  
// 解绑污点
kubectl taint nodes node1 node-role.kubernetes.io/master:NoSchedule-
kubectl taint nodes node1 node.kubernetes.io/disk-pressure:NoSchedule-

但是disk-pressure是无法解绑的,会自动再绑上,咋整

这里记录下有用的一些命令:

minikube ssh
minikube node add
minikube node delete
minikube node list

minikube profile list
kubectl config view

kubectl explain storageclass

// svc其实是service
kubectl get svc
kubectl get service
// -w  watch
kubectl get pods -w -l app=nginx
// sts 应该是StatefulSet的缩写
// sacle up and down
kubectl scale sts web --replicas=5
kubectl patch sts web -p '{"spec":{"replicas":3}}'

// 更新 StatefulSets 
kubectl patch statefulset web -p '{"spec":{"updateStrategy":{"type":"RollingUpdate"}}}'
// 还可以更新镜像 厉害了
kubectl patch statefulset web --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/image", "value":"gcr.io/google_containers/nginx-slim:0.8"}]'

// 查看pod的镜像
for p in 0 1 2; do kubectl get pod "web-$p" --template '{{range $i, $c := .spec.containers}}{{$c.image}}{{end}}'; echo; done
// 翻译过来就是
kubectl get pod "web-0" --template '{{range $i, $c := .spec.containers}}{{$c.image}}{{end}}'
// k8s 的两种更新策略 RollingUpdate and OnDelete
// 默认是 RollingUpdate
// 查看滚动更新的状态(status of a rolling update)
kubectl rollout status sts/<name>
// 根据 partition 更新,金丝雀(Canary )更新,就是部分更新
// pod的顺序大于等于partition 才会被更新
kubectl patch statefulset web -p '{"spec":{"updateStrategy":{"type":"RollingUpdate","rollingUpdate":{"partition":2}}}}'
// 还有一种部署策略:蓝/绿部署策略(有时也称为红/黑),蓝色代表当前应用版本,绿色代表新应用版本。在这种情况下,一次只有一个版本处于活动状态。在创建和测试绿色部署时,流量被路由到蓝色部署。完成测试后,我们将流量路由到新版本。
// 但绿部署成本高昂,因为它需要双倍的资源
// partition 设为0,则全部更新
kubectl patch statefulset web -p '{"spec":{"updateStrategy":{"type":"RollingUpdate","rollingUpdate":{"partition":0}}}}'

//On Delete 策略
// StatefulSet  支持级联删除 和不级联删除
// 不级联删除 就是删除了StatefulSet,但pod不会被删除,例如不级联删除是:
kubectl delete statefulset web --cascade=orphan
// 这个时候pod不会被删除
// 如果手动删除一个pod,重新apply 即可
kubectl delete pod web-0
kubectl apply -f web.yaml
//但是apply后 pod是两个,所以web-2 会是Terminating   状态
// 当然 数据不会被删除,因为PersistentVolumes 没有被删除,重新创建StatefulSet 后,会被重新挂载

// 默认是级联删除
kubectl delete statefulset web
// 那么 所有pod都会是Terminating   状态
// 还有,service也不会被删除,需要手动删除
kubectl delete service nginx

// StatefulSet 的Pod Management Policy 默认是OrderedReady 的,是保证顺序的,也就是一个一个创建,后一个要等前一个创建完再创建
// 但也有不用等的设置podManagementPolicy: "Parallel"即可
// 只有scaling会Parallel,update 不影响


// SRV record
最近在看k8s文档,看到DNS,对A Record和SRV Record有些疑惑,查找资料之后再次记录一下。
A Record对应着一个具体的IP地址,类似于 www.jianshu.com 对应的IP地址为208.93.64.253
SRV Record对应于一系列相同服务的记录,类似下面的形式:
_sip代表服务的名字,_tcp代表传输协议,SRV记录的内容将两个记录的优先级定义为10。 第一个记录的权重为60,第二个记录的权重为20。优先级和权重值可用于鼓励使用某些服务器而不是其他服务器。

https://blog.csdn.net/JakeMa1024/article/details/111549865

还需了解的东西:

  • DNS的基础知识
  • Feature Gates 不知道是什么
  • kube-apiserver --enable-admission-plugins 只能修改文件,然后等它自动重启吗? 官网用命令行是怎么实现的?
  • disk-pressure出现的阈值是多少?怎么解决,需要再查看官网的说明
  • 在浏览器里面显示 linux的shell是什么原理 ,了解wssh
  • canvas-lms 了解

最后再说一下,刚开始学习k8s,急于安装,草草的浏览一遍basic,就去安装了,各种折腾,遇到各种问题也不知道为什么。所以如果让我回到最初,我肯定不会再花很长时间在本地安装了,废了大力气安装成了,又能怎样··官网很多demo不还是运行不了吗?
初学就用https://labs.play-with-k8s.com,不会有那么多莫名其妙的bug,就是改文件什么的麻烦。不过也不多,大多都是复制粘贴教程上的命令。

顺便一说 shell中复制粘贴快捷键: 复制:Ctrl+Insert 粘贴:ShIft+Insert

还有 https://labs.play-with-docker.com/ 也很好玩。这种技术真的是划时代的意义啊。

kubernetes官网可以说是非常详尽了,
Concepts
Tasks
Tutorials
都写的非常详细。如果不能看完,最起码把关键的看一看,然后其他都大概浏览一遍,指定它讲的什么内容即可,需要时再回来翻。

最后再重复一遍,真的要系统学习Linux基础了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值