Category Archives: k8s

K8s 开启临时容器功能

1、开始

k8s 在1.16以后加入了debug 功能,开启临时容器(EphemeralContainers)特性后,就可以调式容器。因为是此功能处于alpha阶段,默认不会启用,下面说下开启方法:

在管理节点编辑如下两个文件:

  • /etc/kubernetes/manifests/kube-apiserver.yaml
  • /etc/kubernetes/manifests/kube-scheduler.yaml

command 部分加入如下代码:--feature-gates=EphemeralContainers=true

这样在接下来创建的新pod 就可以使用临时容器功能。

2、使用

##进程共享模式
~ $ kubectl run some-app --image=nginx --restart=Never
~ $ kubectl debug -it some-app --image=busybox --share-processes --copy-to=some-app-debug

##注入pod 检查网络类问题
## 在1.21.2上测试,运行debug后一直不显示命令行,暂时不可用
~ $ kubectl run distroless-python --image=martinheinz/distroless-python --restart=Never
kubectl debug -it distroless-python --image=praqma/network-multitool --target=distroless-python -- sh

##node 节点调式
##如要调式的node节点名称为work2,这样会创建一个pod,node的/文件在/host目录下
kubectl debug node/work2 -it --image=centos

promethues

#gitlab集成的promethues配置文件
---
global:
  scrape_interval: 15s
  scrape_timeout: 15s
scrape_configs:
- job_name: prometheus
  static_configs:
  - targets:
    - localhost:9090
- job_name: redis
  static_configs:
  - targets:
    - localhost:9121
- job_name: postgres
  static_configs:
  - targets:
    - localhost:9187
- job_name: node
  static_configs:
  - targets:
    - localhost:9100
- job_name: gitlab-unicorn
  metrics_path: "/-/metrics"
  static_configs:
  - targets:
    - 127.0.0.1:8080
- job_name: gitlab_monitor_database
  metrics_path: "/database"
  static_configs:
  - targets:
    - localhost:9168
- job_name: gitlab_monitor_sidekiq
  metrics_path: "/sidekiq"
  static_configs:
  - targets:
    - localhost:9168
- job_name: gitlab_monitor_process
  metrics_path: "/process"
  static_configs:
  - targets:
    - localhost:9168
- job_name: kubernetes-nodes
  scheme: https
  tls_config:
    ca_file: "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"
    insecure_skip_verify: true
  bearer_token_file: "/var/run/secrets/kubernetes.io/serviceaccount/token"
  kubernetes_sd_configs:
  - role: node
    api_server: https://kubernetes.default.svc:443
    tls_config:
      ca_file: "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"
    bearer_token_file: "/var/run/secrets/kubernetes.io/serviceaccount/token"
  relabel_configs:
  - action: labelmap
    regex: __meta_kubernetes_node_label_(.+)
  - target_label: __address__
    replacement: kubernetes.default.svc:443
  - source_labels:
    - __meta_kubernetes_node_name
    regex: "(.+)"
    target_label: __metrics_path__
    replacement: "/api/v1/nodes/${1}/proxy/metrics"
  metric_relabel_configs:
  - source_labels:
    - pod_name
    target_label: environment
    regex: "(.+)-.+-.+"
- job_name: kubernetes-pods
  tls_config:
    ca_file: "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"
    insecure_skip_verify: true
  bearer_token_file: "/var/run/secrets/kubernetes.io/serviceaccount/token"
  kubernetes_sd_configs:
  - role: pod
    api_server: https://kubernetes.default.svc:443
    tls_config:
      ca_file: "/var/run/secrets/kubernetes.io/serviceaccount/ca.crt"
    bearer_token_file: "/var/run/secrets/kubernetes.io/serviceaccount/token"
  relabel_configs:
  - source_labels:
    - __meta_kubernetes_pod_annotation_prometheus_io_scrape
    action: keep
    regex: 'true'
  - source_labels:
    - __meta_kubernetes_pod_annotation_prometheus_io_path
    action: replace
    target_label: __metrics_path__
    regex: "(.+)"
  - source_labels:
    - __address__
    - __meta_kubernetes_pod_annotation_prometheus_io_port
    action: replace
    regex: "([^:]+)(?::[0-9]+)?;([0-9]+)"
    replacement: "$1:$2"
    target_label: __address__
  - action: labelmap
    regex: __meta_kubernetes_pod_label_(.+)
  - source_labels:
    - __meta_kubernetes_namespace
    action: replace
    target_label: kubernetes_namespace
  - source_labels:
    - __meta_kubernetes_pod_name
    action: replace
    target_label: kubernetes_pod_name

helm

介绍

Helm 是一个 Kubernetes 的包管理工具,类似 Linux 的包管理器,如RedHat系的yum、Debian的apt,可以很方便的将之前打包好的 yaml 文件部署到 Kubernetes 上。Helm主要解决以下问题:1、把yaml作为一个整体管理。2、实现yaml的高效复用。3、实现应用级别的版本管理。

当前 Helm 已经升级到V3版本,相比于V2版本主要变化如下:

1、 最明显的变化是删除了 Tiller 。
2、 Release 名称可以在不同命名空间重用。
3、 支持将 Chart 推送至 Docker 镜像仓库中。
4、 使用 JSONSchema 验证 chart values。

Helm 有3个重要概念:
    1、helm: 一个命令行客户端工具,主要用于 Kubernetes 应用 chart 的创建、 打包、 发布和管理。
    2、Chart:应用描述,一系列用于描述 k8s 资源相关文件的集合。
    3、Release:基于 Chart 的部署实体,一个 chart 被 Helm 运行后将会生成对应的一个release;release是在 k8s 中创建出真实运行的资源对象。

下图是 Helm V2 与 Helm V3 的架构图对比:

V2版本的架构中,Tiller在Kubernetes集群中,Helm Client发请求给Tiller需要经过RBAC认证。而V3版本是Helm通过kubeconfig连接kube-apiserver,避免了使用者去配置RBAC权限。

安装

可以直接下载二进制文件 https://github.com/helm/helm/releases linux amd64

解压后 把helm 复制到bin目录 mv linux-amd64/helm /usr/local/bin/helm

如同yum、apt拥有仓库一样,Helm也有仓库,使用Helm默认仓库下载Chart比较慢,可以增加微软、阿里的仓库。

添加微软Chart仓库

helm repo add stable http://mirror.azure.cn/kubernetes/charts

使用

##查看 可用chart
$ helm search repo stable
##安装mysql
$ helm repo update              # Make sure we get the latest list of charts
$ helm install stable/mysql --generate-name  ##generate-name就是本地mysql的名字
                                             随机生成,
Released smiling-penguin
$ helm install wujy_mysql stable/mysql           #也可以自己定义名字

##查看已安装的released
$ helm ls
NAME             VERSION   UPDATED                   STATUS    CHART
smiling-penguin  1         Wed Sep 28 12:59:46 2016  DEPLOYED  mysql-0.1.0
##卸载一个release
$ helm uninstall smiling-penguin
Removed smiling-penguin

常用命令

查找 helm search <hub/repo> CHARTNAME
安装 helm install --name mem1 stable/memcached
获取状态信息 helm status mem1
列出 helm list [-a]
下载 helm get stable/redis
创建 helm create CHARTNAME
语法检测 helm lint CHARTNAME
打包 helm package CHARTNAME
显示状态 helm status NAME

NFS subdir external provisioner

这个provisioner支持用已有的nfs动态的创建PV,下面记录下部署过程。

前提已经有一个k8s集群,一台nfs服务器。我的环境是1master ,2worker的k8s,用work2搭建了nfs

步骤如下:

1. 准备好nfs服务器的信息

确保你的k8s可以正常访问nfs服务器,服务器IP (192.168.157.130) , 共享目录(/public)

2. 下载 provisioner 文件


git clone https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner.git
#切换到nfs-subdir-external-provisioner目录下

3. 安装RBAC授权相关的账号、角色、绑定

#编辑 deploy/rbac.yaml  deployment.yaml
#我把provisioner安装在kube-system命名空间,这个可以自己定义修改
$ NAMESPACE="kube-system"
$ sed -i'' "s/namespace:.*/namespace: $NAMESPACE/g" ./deploy/rbac.yaml ./deploy/deployment.yaml
$ kubectl create -f deploy/rbac.yaml -f deploy/deployment.yaml

4.配置provisioner

编辑deploy/deployment.yaml文件,修改image 为国内镜像,不然下载不下来(比如我的:registry.cn-hangzhou.aliyuncs.com/jimywu/nfs-subdir-external-provisioner:v4.0.0);

修改<YOUR NFS SERVER HOSTNAME> 和 <YOUR PATH>,我的分别为192.168.157.130,/public

其他的都保持默认,kubectl create -f deploy/deployment.yaml 安装

kind: Deployment
apiVersion: apps/v1
metadata:
  name: nfs-client-provisioner
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nfs-client-provisioner
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccountName: nfs-client-provisioner
      containers:
        - name: nfs-client-provisioner
          image: gcr.io/k8s-staging-sig-storage/nfs-subdir-external-provisioner:v4.0.0
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: k8s-sigs.io/nfs-subdir-external-provisioner
            - name: NFS_SERVER
              value: <YOUR NFS SERVER HOSTNAME>
            - name: NFS_PATH
              value: <YOUR PATH>
      volumes:
        - name: nfs-client-root
          nfs:
            server: <YOUR NFS SERVER HOSTNAME>
            path: <YOUR PATH>

5.部署 storage class

编辑 deploy/class.yaml 文件,增加5,6两行,把此storageclass设置为系统默认,这样创建PV时不用指明SC的名字。

  1 apiVersion: storage.k8s.io/v1
  2 kind: StorageClass
  3 metadata:
  4   name: managed-nfs-storage
  5   annotations:
  6     "storageclass.kubernetes.io/is-default-class": "true"
  7 provisioner: k8s-sigs.io/nfs-subdir-external-provisioner # or choose another name, must match deployment's env PROVISIONER_NAME'
  8 parameters:
  9   archiveOnDelete: "false"

最后 kubectl create deploy/class.yaml 部署。以上没有出错,基本已经完成部署。

设置默认storageClass

kubectl patch sc managed-nfs-storage -p ‘{“metadata”: {“annotations”:{“storageclass.kubernetes.io/is-default-class”:”true”}}}’

参考链接:官方git : https://github.com/kubernetes-sigs/nfs-subdir-external-provisioner