Jenkins+k8s реализует автоматическое развертывание

задняя часть облачный носитель Kubernetes
Jenkins+k8s реализует автоматическое развертывание

предисловие

Jenkins — относительно распространенный инструмент CI/CD, а Kubernetes — также очень популярный инструмент оркестровки Эти два инструмента занимают очень важное место в devops, так как же совместить их в devops?

Конфигурация среды

название Версия адрес
Kubernetes v1.20.5 192.168.0.104:6443
Gitlab 13.11.3 192.168.0.102:13080
Harbor v2.1.5 192.168.0.102:1080
Jenkins 2.277.3 192.168.0.102:8081
kuboard v3.1.1.4 192.168.0.102:8080

Компонент Описание

  • Harbor

Harbour — это сервер реестра корпоративного уровня для хранения и распространения образов Docker, расширяющий дистрибутив Docker с открытым исходным кодом за счет добавления некоторых необходимых для предприятия функций, таких как безопасность, идентификация и управление. Как частный сервер реестра корпоративного уровня, Harbour обеспечивает лучшую производительность и безопасность. Повысьте эффективность передачи образов, чтобы пользователи могли использовать реестр для создания и запуска среды.

  • kuboard

kuboard — это визуальная веб-страница управления kubernets, которая содержит множество функций и может очень хорошо и эффективно управлять кластерами kubernets.

PS: Не буду объяснять установку каждого компонента, ведь такие можно поискать в интернете.

Конфигурация Дженкинса

Установка плагина

Настройте сайт обновления плагина (увеличьте скорость загрузки плагина)

  • Управление системой -> Управление плагинами -> Дополнительно

Установите плагины, необходимые для Kubernetes.

  • Kubernetes :: Pipeline :: DevOps Steps
  • Kubernetes CLI Plugin
  • Kubernetes plugin
  • Kubernetes Credentials Plugin

Установите плагины, необходимые для gitlab

  • GitLab Plugin
  • Generic Webhook Trigger Plugin

Не забудьте перезагрузить после установки

Дженкинс настраивает кластер Kubernetes

Сначала добавьте учетные данные кластера k8s

  • Управление системой->Управление учетными данными->Дженкинс->Глобальные учетные данные->Добавить учетные данныеimage.png image.png
    • Описание поля:
      • Секрет: учетные данные k8s, также называемые k8s-token
        • Получите токен и выполните его в кластере k8s
            // 1. 创建serverAccount
            kubectl create clusterrolebinding add-on-cluster-admin --clusterrole=cluster-admin --serviceaccount=tools:default
            // 2. 获取serverAccountToken
            kubectl -n tools describe secret $(kubectl -n tools get secret | grep default | awk '{print $1}')
        
        • Скопируйте полученный токен в учетные данные

Настройте информацию о кластере k8s

  • Перейдите в Управление системой->Управление узлами->configureClouds.
  • Добавить новое облакоВыбрать Kubernetesimage.png image.png
    • Описание основных полей конфигурации:
      • Kubernetes-адрес

        Адрес Api-сервера в Kubernetes, который можно посмотреть через кат ~/.kube/config

      • пространство имен Kubernetes

        Пространство имен, которое модуль jenkins-agent выполняет по умолчанию.

      • Реквизиты для входа

        Учетные данные, используемые для доступа к кластеру Kubernetes, выберите «Добавить к учетным данным» выше.

      • Дженкинс адрес

        Это адрес, на который перезванивает Jenkins-agent при запуске, если вы введете ошибку, pod будет создаваться повторно.

    • После завершения настройки нажмите [Проверка подключения]image.pngПоявляется, как показано, чтобы указать на успех.

тестовая сборка

  • Создать новую задачу конвейераimage.png

  • Написать синтаксис конвейера

    def label = "mypod-${UUID.randomUUID().toString()}"
    podTemplate(label: label, cloud: 'myk8s') {
        node(label) {
            stage('Run shell') {
                sh 'sleep 100s'
                sh 'echo hello world.'
            }
        }
    }
  • Сохраните и создайте тест, а также просмотрите журнал сборки.image.png
  • Соответствующий модуль также можно увидеть в кластере k8s.image.png

Дженкинс настраивает ключ гавани

  • Управление системой->Управление учетными данными->Дженкинс->Глобальные учетные данные->Добавить учетные данные
  • Выберите имя пользователя с паролемimage.png
  • Нажмите «Сохранить», он будет использоваться позже в Jenkinsfile.

Дженкинс настраивает доступ к Gitlab

  • Шаг 1. Сначала получите токен доступа Gitlabimage.png image.png

  • Шаг 2. Добавьте токен доступа Gitlab в Jenkins.image.png

  • Шаг 2. Настройте конфигурацию Gitlab в Jenkins.

    • Управление системой -> Конфигурация системы -> gitlabimage.png

Создавать тестовые задания

  • Создать новую задачу конвейераimage.png

  • Задачи конфигурации

    • Триггеры сборки, вот конфигурации, которые могут автоматически запускать сборки, когда git фиксируетimage.png image.png
    • Настройте конвейер и выберите сценарий конвейера из SCM.image.png
  • Скрипты Jenkinsfile

// 定义Jenkins-agent在k8s中的pod名称,不要重名
def label = "build-testserverone-${UUID.randomUUID().toString()}"
podTemplate(
    cloud: "myk8s",
    namespace: "tools",
    label: label,
    // 配置容器信息
    containers: [
        containerTemplate(
            name: "jnlp",
            image: "${HARBOR_REG}/jenkins/k8s-agent:1.0.1"
        ),
    ],
    // 挂载,主要是为了使用宿主机的docker
    volumes: [
        hostPathVolume(mountPath: '/var/run/docker.sock', hostPath: '/var/run/docker.sock'),
        hostPathVolume(mountPath: '/usr/bin/docker', hostPath: '/usr/bin/docker'),
        hostPathVolume(mountPath: '/root/.m2', hostPath: '/root/.m2')
    ]
) {
    node(label) {
        // 拉取代码
        stage("clone") {
            checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[credentialsId: 'jenkinsgitlab', url: 'ssh://git@192.168.0.102:13022/istiodemo/testserverone.git']]])
        }

        // 构建镜像
        stage("build") {
            echo "开始构建docker镜像"
            sh "docker build -t ${HARBOR_REG}/istio-demo/testserverone:${env.BUILD_TIMESTAMP} ."
            echo "构建结束"
        }
        // 上传镜像到私有镜像库
        stage("publish") {
            // 获取harbor的用户命和密码
            withCredentials([usernamePassword(credentialsId: 'harbor', passwordVariable: 'HARBOR_SECRET_PSW', usernameVariable: 'HARBOR_SECRET_USR')]) {
                echo "开始推送镜像"
                sh "docker login -u ${HARBOR_SECRET_USR} -p ${HARBOR_SECRET_PSW} http://${HARBOR_REG}"
                sh "docker push ${HARBOR_REG}/istio-demo/testserverone:${env.BUILD_TIMESTAMP}"
                sh "docker rmi ${HARBOR_REG}/istio-demo/testserverone:${env.BUILD_TIMESTAMP}"
                echo "推送结束"
            }
        }
        // 进行k8s发布
        stage("deploy") {
            dir('deploy') {
                def image_name = "${HARBOR_REG}\\/istio-demo\\/testserverone:${env.BUILD_TIMESTAMP}"
                echo "替换image路径"
                sh """
                sed -i 's/IMAGE_PATH/${image_name}/g' deployment.yaml
                """
                echo "部署app"
                sh "kubectl apply -f deployment.yaml"
                echo "部署service"
                sh "kubectl apply -f service.yaml"
                echo "部署ingress"
                sh "kubectl apply -f ingress.yaml"
                echo "部署结束"
            }
        }
    }
}
  • При его использовании следует учитывать, что при запуске Jenkins-agent он по умолчанию использует образ jenkins/inbound-agent, но этот образ устанавливает пользователя как Jenkins. подскажите, что у докера нет разрешений, поэтому я пересобрал образ и упаковал имена, связанные с k8s. DOCKERFILE выглядит следующим образом
    FROM jenkins/inbound-agent:4.7-1-alpine
    # 修改为root用户启动
    USER root

    ARG KUBECTL_VERSION=1.17.5
    ARG KUSTOMIZE_VERSION=v3.8.1
    ARG KUBESEAL_VERSION=v0.15.0

    RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories

    RUN apk add curl

    # Install kubectl (same version of aws esk)
    RUN curl -sLO https://storage.googleapis.com/kubernetes-release/release/v${KUBECTL_VERSION}/bin/linux/amd64/kubectl && \
        mv kubectl /usr/bin/kubectl && \
        chmod +x /usr/bin/kubectl

    # Install kustomize (latest release)
    RUN curl -sLO https://github.com/kubernetes-sigs/kustomize/releases/download/kustomize%2F${KUSTOMIZE_VERSION}/kustomize_${KUSTOMIZE_VERSION}_linux_amd64.tar.gz && \
        tar xvzf kustomize_${KUSTOMIZE_VERSION}_linux_amd64.tar.gz && \
        mv kustomize /usr/bin/kustomize && \
        chmod +x /usr/bin/kustomize

    # Install kubeseal
    RUN curl -sL https://github.com/bitnami-labs/sealed-secrets/releases/download/${KUBESEAL_VERSION}/kubeseal-linux-amd64 -o kubeseal && \
        mv kubeseal /usr/bin/kubeseal && \
        chmod +x /usr/bin/kubeseal

    ENTRYPOINT ["/usr/local/bin/jenkins-agent"]
  • Конфигурация хука Gitlabimage.png image.png

  • построить тестimage.png

  • Тест push-сборки Gitlabimage.png image.png image.png

Суммировать

При самостоятельной настройке многие конфигурации были написаны очень расплывчато при проверке данных, и нам нужно было полагаться на догадки, поэтому часть конфигураций я разобрал в процессе сборки и записал их, чтобы их можно было использовать в следующий раз.

Эта статья посвящена комбинированной конфигурации Jenkins и k8s, и я надеюсь, что она будет полезна студентам, прочитавшим эту статью.