Официальный сайт Jenkins развернут на кластере k8s.
Подготовьте кластер k8s. Я не буду здесь это подробно показывать. О подготовке кластера k8s можно прочитать в другом моем посте.
kubectl создать пространство имен DevOps
вопрос командования,Очень просто,Вы также можете писать файлы yaml,Слишком лень писать
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: jenkins-admin
rules:
- apiGroups: [""]
resources: ["*"]
verbs: ["*"]
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: jenkins-admin
namespace: devops
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: jenkins-admin
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: jenkins-admin
subjects:
- kind: ServiceAccount
name: jenkins-admin
namespace: devops
Краткое введение: Вышеупомянутые ресурсы создают аутентифицированного клиента.
ClusterRole определяет набор разрешений, которые имеют полные разрешения для всех групп и ресурсов API.
ServiceAccount, который представляет приложение или компонент и имеет токен для доступа к API Kubernetes в кластере.
ClusterRoleBinding привязывает ранее определенный ServiceAccount с именем «jenkins-admin» к ClusterRole с именем «jenkins-admin», так что ServiceAccount имеет все разрешения для работы с API Kubernetes. В то же время этот ServiceAccount может быть назван только в «devops». Доступ к ресурсам внутри пространства.
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: jenkins-pv-volume
labels:
type: local
spec:
storageClassName: local-storage
claimRef:
name: jenkins-pv-claim
namespace: devops
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
local:
path: /mnt/jenkins
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- k8s-node1 ## Измените здесь имя узла вашего собственного k8, kubectl get nodes
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: jenkins-pv-claim
namespace: devops
spec:
storageClassName: local-storage
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi
Инструкции по настройке монтируемого тома
####Ресурс StorageClass##########
provisioner: Поставщики, которые определяют классы хранения, то есть то, как тома хранения предоставляются приложениям. Значение здесь kubernetes.io/no-provisioner, указывающий, что для этого класса хранилища не требуются дополнительные поставщики динамических томов.
volumeBindingMode: Определяет режим привязки тома, т. е. способ подключения тома к Pod Сделайте привязку. Значение здесь WaitForFirstConsumer означает, что до тех пор, пока первый потребитель не будет использовать том Pod До того как это произойдет, том не будет привязан ни к какому узлу.
#######PersistentVolume#########
storageClassName: local-storage: укажите имя класса хранилища. Здесь используется класс хранилища «local-storage».
претензияRef: которые утверждают, что этот постоянный том востребован (Persistent Volume Претензия) использована.
емкость: Выделите емкость для этого постоянного тома.
storage: 10Gi: выделите 10Gi дискового пространства.
accessModes: Укажите режим доступа к хранилищу.
ReadWriteOnce: Разрешен только доступ в режиме чтения-записи к одному узлу.
local: Укажите тип хранилища как локальное хранилище.
path: /mnt/jenkins: укажите путь к постоянному тому как «/mnt/jenkins».
nodeAffinity: Укажите привязку узла, то есть этот постоянный том будет развернут только в определенном Kubernetes. Узел узла.
required: Указывает, что требуется привязка узла.
nodeSelectorTerms: Сопоставление на основе селектора узла.
matchExpressions: Соответствующее выражение, используемое для указания узла этого постоянного тома.
key: kubernetes.io/hostname: укажите соответствующее имя ключа «kubernetes.io/hostname».
operator: In: укажите режим соответствия «in».
значения:: Укажите соответствующие значения.
k8s-node1: соответствует Kubernetes с именем «k8s-node1». Узел узла.
pvcНечего объяснять,Общие конфигурации,Привяжите соответствующий PV на основе выделенного хранилища.
apiVersion: apps/v1
kind: Deployment
metadata:
name: jenkins
namespace: devops
spec:
replicas: 1
selector:
matchLabels:
app: jenkins-server
template:
metadata:
labels:
app: jenkins-server
spec:
securityContext:
fsGroup: 1000
runAsUser: 1000
serviceAccountName: jenkins-admin
containers:
- name: jenkins
image: jenkins/jenkins:2.369 #Просто используйте это для зеркала. Версия 2.369. Зеркальная версия официального документа слишком низкая. Похоже, это версия 2.2, и она не поддерживает некоторые плагины.
imagePullPolicy: IfNotPresent
# resources:
# limits:
# memory: "2Gi"
# cpu: "1000m"
# requests:
# memory: "500Mi"
# cpu: "500m"
ports:
- name: httpport
containerPort: 8080
- name: jnlpport
containerPort: 50000
# livenessProbe:
# httpGet:
# path: "/login"
# port: 8080
# initialDelaySeconds: 90
# periodSeconds: 10
# timeoutSeconds: 5
# failureThreshold: 5
# readinessProbe:
# httpGet:
# path: "/login"
# port: 8080
# initialDelaySeconds: 60
# periodSeconds: 10
# timeoutSeconds: 5
# failureThreshold: 3
volumeMounts:
- name: jenkins-data
mountPath: /var/jenkins_home #Это рабочий каталог jenkins. Просто смонтируйте его, чтобы данные не были потеряны при перезапуске jenkins.
volumes:
- name: jenkins-data
persistentVolumeClaim:
claimName: jenkins-pv-claim
apiVersion: v1
kind: Service
metadata:
name: jenkins-service
namespace: devops
annotations:
prometheus.io/scrape: 'true' #Этот абзац включен в официальный документ. Он используется, чтобы позволить Прометею (Прометею) идентифицировать модуль, но вы можете пока оставить его в покое.
prometheus.io/path: /
prometheus.io/port: '8080'
spec:
selector:
app: jenkins-server
type: NodePort
ports:
- name: http
port: 8080
targetPort: 8080
nodePort: 32000
- name: agent
port: 50000
targetPort: 50000
nodePort: 50000
Вы сказали, что ваш порт 50000 не установлен, и вы не спросите Baidu? Пересечение Пересечение Пересечение
vim /etc/kubernetes/manifests/kube-apiserver.yaml
apiVersion: v1
kind: Pod
metadata:
annotations:
kubeadm.kubernetes.io/kube-apiserver.advertise-address.endpoint: 10.0.0.120:6443
creationTimestamp: null
labels:
component: kube-apiserver
tier: control-plane
name: kube-apiserver
namespace: kube-system
spec:
containers:
- command:
- kube-apiserver
- --service-node-port-range=3000-55000 #Эта строка не включена по умолчанию. Добавьте ее самостоятельно. Диапазон портов объяснять не нужно.
- --advertise-address=10.0.0.120
- --allow-privileged=true
- --authorization-mode=Node,RBAC
- --client-ca-file=/etc/kubernetes/pki/ca.crt
- --enable-admission-plugins=NodeRestriction
- --enable-bootstrap-token-auth=true
- --etcd-cafile=/etc/kubernetes/pki/etcd/ca.crt
- --etcd-certfile=/etc/kubernetes/pki/apiserver-etcd-client.crt
После замены ничего делать не нужно.,Он изменит себя,Нет необходимости перезапускать
Файлы YAML могут быть размещены в одном каталоге.
kubectl применить -f .
Проверьте, нормально ли запускается модуль
Проверьте, нормально ли запускается ресурс svc
Вы можете видеть, что ресурс запустился нормально.
Модуль развертывается на узле 1 и имеет прямой доступ к IP+порту узла 1.
Появление этого веб-интерфейса доказывает, что развертывание Jenkins прошло успешно.
Пароль можно получить, просмотрев журнал модуля.
Скопировать ввод пароля
Установите эти два языка
Ожидание установки
Создать пользователя
Таким образом, jenkins настраивается в кластере k8s.
успех
Созданные 111 файлов находятся в рабочей области в каталоге монтирования.