9.k8s常用资源补充内容

2022-04-11 分类:k8s 阅读(482) 评论(0)

孙富阳, 江湖人称没人称。多年互联网运维工作经验,曾负责过孙布斯大规模集群架构自动化运维管理工作。擅长Web集群架构与自动化运维,曾负责国内某大型博客网站运维工作。

1.为Node节点增加污点

1.污点的类型

NoExecute
   不再接受新的Pod调度,并且还会驱赶已经调度到当前节点的Pod。
NoSchedule
   不再接受新的Pod调度,但也不会驱赶已经调度到当前Node的Pod。
PreferNoSchedule
   该节点可以接收调度,但尽可能的会将Pod调度到其它节点,如果其它节点无法被调度后,依旧也可以调度到当前节点

2.给node打标签和删除标签

###打标签
kubectl label node k8s-master school= ###可以不给标签设定值
kubectl label node k8s-node  class=sfy ###也可以设定值
###删除标签
kubectl label node k8s-master school-
kubectl label node k8s-node class-
温馨提示:
只要在KEY的名称后面加一个"-"就可以删除该标签!

3.添加污点和删除污点

###添加污点
(1)先对节点打标签
kubectl label node k8s-master school=
(2)添加污点
kubectl taint node k8s-master school=NoSchedule
(3)查看污点
kubectl describe node k8s-master | grep Taints
###删除污点
(1)删除污点
kubectl taint node k8s-master school-
(2)查看污点是否被成功删除
kubectl describe node k8s-master | grep Taints

2.为Pod资源添加容忍度

###为node打标签
[root@k8s-master ~]# kubectl label nodes k8s-master sfy=sfy
###为node打上污点
kubectl taint node k8s-master sfy=sfy:NoSchedule
### Pod配置容忍度
[root@k8s-master ~]# cat k8s_deployment1.yaml 
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      tolerations: ###配置容忍度
      - key: "sfy" ###键名为sfy
        # operator: "Exists" 
        value: "sfy" ###键值为sfy
        effect: "NoExecute" ###容忍的污点类型
      containers:
      - name: nginx
        image: nginx:1.13
        ports:
        - containerPort: 80
        resources:  ###资源
          limits:   ###资源限制
            cpu: 100m
            memory: 10M
          requests:   ###资源需求
            cpu: 100m
            memory: 10M
ps:当node节点有多个污点的时候,pod容忍的应当把所有污点都写进yanl文件里,否则依然无法在污点节点创建pod
也可以通过nodename和nodeslector来指定pod创建节点,但是如果打了污点也必须在yaml文件中配置容忍度

3. Secret资源

1.Secret概述

与ConfigMap类似,区别在于Secret主要存储敏感数据,所有的数据要经过base64编码。但对于程序员而言,这依旧是明文数据,只不过想要拿到明文数据需要只需使用base64进行解码即可。
如下,基于base64进行编码和解码只需一行命令就搞定了。
        [root@k8s-master ~]#  echo -n "sfy" | base64
        c2Z5
        [root@k8s-master ~]#  echo -n "c2Z5" | base64 -d
        sfy
应用场景:
        多用于存储凭据信息。
"kubectl create secret"支持常用的三种数据类型如下:(较ConfigMap支持的类型要多,我们可以理解ConfigMap支持的只是存储文本信息,对于存储仓库认证信息,TLS证书等ConfigMap均不支持,此时我们应该采用Secret)
        (1)docker-registry(kubernetes.io/dockerconfigjson):
            存储镜像仓库认证信息。
        (2)generic(Opaque):
            存储密码,秘钥等。
        (3)tls(kubernetes.io/tls):
            存储TLS证书。

    除了上面提到的几种类型,还有其它几种内置的数据类型推荐阅读:
        https://kubernetes.io/zh/docs/concepts/configuration/secret/

温馨提示:对于"kubernetes.io/service-account-token"这种类型是kubernetes预留的
 [root@k8s-master ~]# kubectl get secret
NAME               TYPE                            DATA   AGE
default-token-z2bqv  kubernetes.io/service-account-token   3     20h

2.secret简单应用作为容器环境变量

将用户名和密码进行base64编码

[root@k8s-master ~]# echo -n "admin" | base64
YWRtaW4=
[root@k8s-master ~]# echo -n "sunfuyang" | base64
c3VuZnV5YW5n

创建"Secret"资源

[root@k8s-master ~]# cat secret-demo.yaml 
apiVersion: v1
kind: Secret
metadata:
  name: db-user-pass
type: Opaque  # 此处我们指定Secret资源的类型为"Opaque",通常用于存储密码,密钥等.
data:
  # 将编码后的值放到Secret资源的配置文件中
  username: YWRtaW4=
  password: c3VuZnV5YW5n
[root@k8s-master ~]# kubectl apply -f secret-demo.yaml

将Secret的数据定义为容器的环境变量

##第一种写法
[root@k8s-master ~]# cat secret-pod-demo.yaml
apiVersion: v1
kind: Pod
metadata:
  name: db-secret-demo
spec:
  containers:
    - name: demo
      image: nginx:1.13
      env:
      - name: NAUS ###指定变量名字
        valueFrom: ###指定变量来源
          secretKeyRef: ###变量来源为secretkeyref
            name: db-user-pass ###secret的名字
            key: password ###secret中的键名称
[root@k8s-master ~]# kubectl apply -f secret-pod-demo.yaml
第二种写法更简单
[root@k8s-master ~]# cat secret-pod-demo2.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: secret-test-pod
spec:
  containers:
    - name: test-container
      image: nginx:1.13
      envFrom: ###变量来源
      - secretRef: ###指定变量来源为secret
          name: db-user-pass ###指定secret的名字
      env:
      - name: USE
        value: test

3.secret存储容器镜像仓库拉取的账号密码

创建secret资源

###基于命令行创建
kubectl create secret docker-registry harbor-secret --namespace=default  --docker-username=admin  --docker-password=a123456 --docker-server=blog.sfy.com
###基于yaml文件创建
将用户名和密码进行base64编码
[root@k8s-master ~]# echo '{"auths":{"hub.com":{"username":"20","password":"Y2"}}}'|base64
[root@k8s-master ~]# cat harbor-secret.yaml 
apiVersion: v1
data:
  .dockerconfigjson: eyJhdXRocyI ###上面编码的内容
kind: Secret
metadata:
  name: harbor-secret
  namespace: default
type: kubernetes.io/dockerconfigjson

方法一、基于sa资源引用镜像仓库的secret

###创建sa资源引用secret
[root@k8s-master ~]# cat k8s_sa_harbor.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: docker-image
  namespace: default
imagePullSecrets:
- name: harbor-secret
###创建pod资源引用sa资源
[root@k8s-master ~]# cat k8s_pod.yaml
iapiVersion: v1
kind: Pod
metadata:
  name: static-pod
spec:
  serviceAccount: docker-image
  containers:
  - name: nginx
    image: 2195802440/nginx:1.13
    ports:
    - containerPort: 80

方法二、pod直接引用镜像仓库的secret

[root@k8s-master ~]# cat k8s_pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: static-pod
spec:
  nodeName: 10.0.0.12
  imagePullSecrets:  ###镜像下载的secrets资源
  - name: harbor-secret ###secret资源名称
  containers:
  - name: nginx
    image: 2195802440/nginx:1.13
    ports:
    - containerPort: 80

4.当然secret也可以当成文件挂载到pod中

apiVersion: v1
kind: Pod
metadata:
  name: mypod
spec:
  containers:
  - name: mypod
    image: redis
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"
  volumes:
  - name: foo
    secret:
      secretName: mysecret
      defaultMode: 0400
   ####默认是挂载到/etc/foo/路径下的
      items: ###指定键
      - key: username ###指定键名
        path: sfy ###指定路径,容器中的路径为即/etc/foo/sfy

4.ConfigMap资源

1.ConfigMap概述

创建ConfigMap资源后,数据实际会存储在Kubernetes集群中的ETCD数据库,然后通过创建Pod时引入该数据。
    应用场景:
        应用程序配置。
    ConfigMap支持两种数据类型:
        (1)键值对;
        (2)多行数据;
    Pod使用ConfigMap数据有两种方式:
        (1)变量注入;
        (2)数据卷挂载;
    推荐阅读:
        https://kubernetes.io/zh/docs/concepts/configuration/configmap/

2.创建ConfigMap资源

apiVersion: v1
kind: ConfigMap
metadata:
  name: game-demo
data:
  # 类属性键;每一个键都映射到一个简单的值
  password: "3"
  username: "sfy"
  # 类文件键
  game-peizhiwenjian: |
    enemy.types=aliens,monsters
    player.maximum-lives=5    
  user-peizhiwenjian2: |
    color.good=purple
    color.bad=yellow
    allow.textmode=true    

3.创建pod引用ConfigMap资源

apiVersion: v1
kind: Pod
metadata:
  name: configmap-demo-pod
spec:
  containers:
    - name: demo
      image: alpine
      command: ["sleep", "3600"]
      env:
        # 定义环境变量
        - name: SFY # 定义变量名称
          valueFrom: ###变量值来源
            configMapKeyRef: ###指定为configmap
              name: game-demo # ConfigMap的名字
              key: password # 需要取的configmap的键
      volumeMounts:  ###将下面的volumes挂载到的路径
      - name: config
        mountPath: "/config"
        readOnly: true
  volumes:
    # 你可以在 Pod 级别设置卷,然后将其挂载到 Pod 内的容器中
    - name: config
      configMap:
        # 提供你想要挂载的 ConfigMap 的名字
        name: game-demo
        # 来自 ConfigMap 的一组键,将被创建为文件
        items:
        - key: "game.properties"
          path: "game.properties"
        - key: "user-interface.properties"
          path: "user-interface.properties"

5.k8s的外部网络映射svc+endpoints

###创建endpoints资源
[root@k8s-master yingshe]# vi mysql_endpoint.yaml 
iapiVersion: v1
kind: Endpoints
metadata:
  name: mysql
subsets:
- addresses:
  - ip: 10.0.0.12
  ports:
  - name: mysql
    port: 3306
    protocol: TCP
###创建svc资源,svc是根据名字绑定endpoints的
[root@k8s-master yingshe]# vi mysql_svc_v2.yaml 
iapiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
  - name: mysql
    port: 3306
    protocol: TCP
    targetPort: 3306  
  type: ClusterIP

4.k8s-proxy的lvs模式

1.如果是kubeadmin部署的

###修改configmaps参数
[root@k8s-master ~]# kubectl edit configmaps -n kube-system kube-proxy
mode参数修改如下图:
###通过日志发现使用的依然是iptables规则
###安装ipvs服务并加载内核参数
[root@k8s-node01 ~]# yum install conntrack-tools -y
[root@k8s-node01 ~]# yum install ipvsadm.x86_64 -y
[root@k8s-master ~]# yum install conntrack-tools -y
[root@k8s-master ~]# yum install ipvsadm.x86_64 -y
[root@k8s-master ~]# modprobe ip_vs_sh
[root@k8s-master ~]# modprobe ip_vs
[root@k8s-master ~]# modprobe ip_vs_rr
[root@k8s-master ~]# modprobe ip_vs_wrr
[root@k8s-node01 ~]# modprobe ip_vs_sh
[root@k8s-node01 ~]# modprobe ip_vs
[root@k8s-node01 ~]# modprobe ip_vs_rr
[root@k8s-node01 ~]# modprobe ip_vs_wrr
###删除pod
[root@k8s-master ~]# kubectl delete pod -n kube-system kube-proxy-555dv
[root@k8s-master ~]# kubectl delete pod -n kube-system kube-proxy-ztsmv
###查看新pod日志

2.如果是二进制部署或者yum部署的

#修改启动参数添加--proxy-mode ipvs
vim /usr/lib/systemd/system/kube-proxy.service
[Unit]
Description=Kubernetes Proxy
After=network.target
[Service]
ExecStart=/usr/bin/kube-proxy \
   ······
  --proxy-mode ipvs \
  --logtostderr=false \
  --v=2
Restart=on-failure
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
systemctl daemon-reload 
systemctl restart kube-proxy.service 
ipvsadm -L -n

评论已关闭

登录

忘记密码 ?

切换登录

注册

鲁ICP备2021019243号-1