• 使用 CRD 开启您的 Ingress 可观测之路


    简介

    CRD 全称是 Custom Resource Definition,是 Kubernetes 的一种内置资源类型,允许用户自定义新的资源类型。观测云实现了 CRD 资源的自定义,然后通过 CRD 控制器实现对自定义的 CRD 对象的管理。使用 CRD 采集指标,可以实现与应用的解耦。以 Ingress 指标采集来说,采集指标需要在部署 Ingress 的 yaml 文件中的 Deployment 资源上增加 annotations,这样 DataKit 就可以通过自定义的 annotations 来采集 Ingress Pod 的指标。有个不好的地方就是 annotations 与 Pod 耦合性太强,使用 CRD 就方便多了,只需要知道 Ingress 的 namespace 和 Deployment 的 name 就可以了。接下来就使用 CRD 一步一步实现 Ingress 的可观测。

    前置条件

    • Kubernetes 集群
    • 观测云账号

    环境版本

    本次示例使用版本如下:

    • DataKit 1.4.11
    • Nginx Ingress Controller 1.1.1

    操作步骤

    步骤 1: 部署 DataKit

    1.1 获取 Token

    登录『观测云』,点击『管理』模块,在基本设置界面找到 Token,点击后面的复制图标。

    1.2 下载 DataKit 部署文件

    登录『观测云』,点击『集成』模块,再点击左上角『DataKit』,选择『Kubernetes』,下载 datakit.yaml 文件。

    1.3 部署 DataKit

    打开 datakit.yaml 文件,把复制的 Token 替换文件中的 ,为了区分集群和选举,增加几个环境变量,k8s-containerd 可以自己定义。

    1. - name: ENV_GLOBAL_HOST_TAGS
    2. value: host=__datakit_hostname,host_ip=__datakit_ip,cluster_name_k8s=k8s-containerd
    3. - name: ENV_NAMESPACE
    4. value: k8s-containerd
    5. - name: ENV_GLOBAL_ELECTION_TAGS
    6. value: cluster_name_k8s=k8s-containerd

    把 datakit.yaml 上传到 Kubernetes 集群的 master 节点,执行命令部署 DataKit。

    kubectl apply -f datakit.yaml
    

    步骤 2: 部署 Ingress

    2.1 编写 ingress-deployment.yaml

    1. apiVersion: v1
    2. kind: Namespace
    3. metadata:
    4. name: ingress-nginx
    5. labels:
    6. app.kubernetes.io/name: ingress-nginx
    7. app.kubernetes.io/instance: ingress-nginx
    8. ---
    9. # Source: ingress-nginx/templates/controller-serviceaccount.yaml
    10. apiVersion: v1
    11. kind: ServiceAccount
    12. metadata:
    13. labels:
    14. helm.sh/chart: ingress-nginx-4.0.15
    15. app.kubernetes.io/name: ingress-nginx
    16. app.kubernetes.io/instance: ingress-nginx
    17. app.kubernetes.io/version: 1.1.1
    18. app.kubernetes.io/managed-by: Helm
    19. app.kubernetes.io/component: controller
    20. name: ingress-nginx
    21. namespace: ingress-nginx
    22. automountServiceAccountToken: true
    23. ---
    24. # Source: ingress-nginx/templates/controller-configmap.yaml
    25. apiVersion: v1
    26. kind: ConfigMap
    27. metadata:
    28. labels:
    29. helm.sh/chart: ingress-nginx-4.0.15
    30. app.kubernetes.io/name: ingress-nginx
    31. app.kubernetes.io/instance: ingress-nginx
    32. app.kubernetes.io/version: 1.1.1
    33. app.kubernetes.io/managed-by: Helm
    34. app.kubernetes.io/component: controller
    35. name: ingress-nginx-controller
    36. namespace: ingress-nginx
    37. data:
    38. allow-snippet-annotations: 'true'
    39. ---
    40. # Source: ingress-nginx/templates/clusterrole.yaml
    41. apiVersion: rbac.authorization.k8s.io/v1
    42. kind: ClusterRole
    43. metadata:
    44. labels:
    45. helm.sh/chart: ingress-nginx-4.0.15
    46. app.kubernetes.io/name: ingress-nginx
    47. app.kubernetes.io/instance: ingress-nginx
    48. app.kubernetes.io/version: 1.1.1
    49. app.kubernetes.io/managed-by: Helm
    50. name: ingress-nginx
    51. rules:
    52. - apiGroups:
    53. - ''
    54. resources:
    55. - configmaps
    56. - endpoints
    57. - nodes
    58. - pods
    59. - secrets
    60. - namespaces
    61. verbs:
    62. - list
    63. - watch
    64. - apiGroups:
    65. - ''
    66. resources:
    67. - nodes
    68. verbs:
    69. - get
    70. - apiGroups:
    71. - ''
    72. resources:
    73. - services
    74. verbs:
    75. - get
    76. - list
    77. - watch
    78. - apiGroups:
    79. - networking.k8s.io
    80. resources:
    81. - ingresses
    82. verbs:
    83. - get
    84. - list
    85. - watch
    86. - apiGroups:
    87. - ''
    88. resources:
    89. - events
    90. verbs:
    91. - create
    92. - patch
    93. - apiGroups:
    94. - networking.k8s.io
    95. resources:
    96. - ingresses/status
    97. verbs:
    98. - update
    99. - apiGroups:
    100. - networking.k8s.io
    101. resources:
    102. - ingressclasses
    103. verbs:
    104. - get
    105. - list
    106. - watch
    107. ---
    108. # Source: ingress-nginx/templates/clusterrolebinding.yaml
    109. apiVersion: rbac.authorization.k8s.io/v1
    110. kind: ClusterRoleBinding
    111. metadata:
    112. labels:
    113. helm.sh/chart: ingress-nginx-4.0.15
    114. app.kubernetes.io/name: ingress-nginx
    115. app.kubernetes.io/instance: ingress-nginx
    116. app.kubernetes.io/version: 1.1.1
    117. app.kubernetes.io/managed-by: Helm
    118. name: ingress-nginx
    119. roleRef:
    120. apiGroup: rbac.authorization.k8s.io
    121. kind: ClusterRole
    122. name: ingress-nginx
    123. subjects:
    124. - kind: ServiceAccount
    125. name: ingress-nginx
    126. namespace: ingress-nginx
    127. ---
    128. # Source: ingress-nginx/templates/controller-role.yaml
    129. apiVersion: rbac.authorization.k8s.io/v1
    130. kind: Role
    131. metadata:
    132. labels:
    133. helm.sh/chart: ingress-nginx-4.0.15
    134. app.kubernetes.io/name: ingress-nginx
    135. app.kubernetes.io/instance: ingress-nginx
    136. app.kubernetes.io/version: 1.1.1
    137. app.kubernetes.io/managed-by: Helm
    138. app.kubernetes.io/component: controller
    139. name: ingress-nginx
    140. namespace: ingress-nginx
    141. rules:
    142. - apiGroups:
    143. - ''
    144. resources:
    145. - namespaces
    146. verbs:
    147. - get
    148. - apiGroups:
    149. - ''
    150. resources:
    151. - configmaps
    152. - pods
    153. - secrets
    154. - endpoints
    155. verbs:
    156. - get
    157. - list
    158. - watch
    159. - apiGroups:
    160. - ''
    161. resources:
    162. - services
    163. verbs:
    164. - get
    165. - list
    166. - watch
    167. - apiGroups:
    168. - networking.k8s.io
    169. resources:
    170. - ingresses
    171. verbs:
    172. - get
    173. - list
    174. - watch
    175. - apiGroups:
    176. - networking.k8s.io
    177. resources:
    178. - ingresses/status
    179. verbs:
    180. - update
    181. - apiGroups:
    182. - networking.k8s.io
    183. resources:
    184. - ingressclasses
    185. verbs:
    186. - get
    187. - list
    188. - watch
    189. - apiGroups:
    190. - ''
    191. resources:
    192. - configmaps
    193. resourceNames:
    194. - ingress-controller-leader
    195. verbs:
    196. - get
    197. - update
    198. - apiGroups:
    199. - ''
    200. resources:
    201. - configmaps
    202. verbs:
    203. - create
    204. - apiGroups:
    205. - ''
    206. resources:
    207. - events
    208. verbs:
    209. - create
    210. - patch
    211. ---
    212. # Source: ingress-nginx/templates/controller-rolebinding.yaml
    213. apiVersion: rbac.authorization.k8s.io/v1
    214. kind: RoleBinding
    215. metadata:
    216. labels:
    217. helm.sh/chart: ingress-nginx-4.0.15
    218. app.kubernetes.io/name: ingress-nginx
    219. app.kubernetes.io/instance: ingress-nginx
    220. app.kubernetes.io/version: 1.1.1
    221. app.kubernetes.io/managed-by: Helm
    222. app.kubernetes.io/component: controller
    223. name: ingress-nginx
    224. namespace: ingress-nginx
    225. roleRef:
    226. apiGroup: rbac.authorization.k8s.io
    227. kind: Role
    228. name: ingress-nginx
    229. subjects:
    230. - kind: ServiceAccount
    231. name: ingress-nginx
    232. namespace: ingress-nginx
    233. ---
    234. # Source: ingress-nginx/templates/controller-service-webhook.yaml
    235. apiVersion: v1
    236. kind: Service
    237. metadata:
    238. labels:
    239. helm.sh/chart: ingress-nginx-4.0.15
    240. app.kubernetes.io/name: ingress-nginx
    241. app.kubernetes.io/instance: ingress-nginx
    242. app.kubernetes.io/version: 1.1.1
    243. app.kubernetes.io/managed-by: Helm
    244. app.kubernetes.io/component: controller
    245. name: ingress-nginx-controller-admission
    246. namespace: ingress-nginx
    247. spec:
    248. type: ClusterIP
    249. ports:
    250. - name: https-webhook
    251. port: 443
    252. targetPort: webhook
    253. appProtocol: https
    254. selector:
    255. app.kubernetes.io/name: ingress-nginx
    256. app.kubernetes.io/instance: ingress-nginx
    257. app.kubernetes.io/component: controller
    258. ---
    259. # Source: ingress-nginx/templates/controller-service.yaml
    260. apiVersion: v1
    261. kind: Service
    262. metadata:
    263. #annotations:
    264. # prometheus.io/scrape: "true"
    265. # prometheus.io/port: "10254"
    266. labels:
    267. helm.sh/chart: ingress-nginx-4.0.15
    268. app.kubernetes.io/name: ingress-nginx
    269. app.kubernetes.io/instance: ingress-nginx
    270. app.kubernetes.io/version: 1.1.1
    271. app.kubernetes.io/managed-by: Helm
    272. app.kubernetes.io/component: controller
    273. name: ingress-nginx-controller
    274. namespace: ingress-nginx
    275. spec:
    276. type: NodePort
    277. # externalTrafficPolicy: Local
    278. # ipFamilyPolicy: SingleStack
    279. # ipFamilies:
    280. # - IPv4
    281. ports:
    282. - name: http
    283. port: 80
    284. protocol: TCP
    285. targetPort: http
    286. appProtocol: http
    287. nodePort: 30049
    288. - name: https
    289. port: 443
    290. protocol: TCP
    291. targetPort: https
    292. appProtocol: https
    293. #- name: prometheus
    294. # port: 10254
    295. # targetPort: prometheus
    296. selector:
    297. app.kubernetes.io/name: ingress-nginx
    298. app.kubernetes.io/instance: ingress-nginx
    299. app.kubernetes.io/component: controller
    300. ---
    301. # Source: ingress-nginx/templates/controller-deployment.yaml
    302. apiVersion: apps/v1
    303. kind: Deployment
    304. metadata:
    305. labels:
    306. helm.sh/chart: ingress-nginx-4.0.15
    307. app.kubernetes.io/name: ingress-nginx
    308. app.kubernetes.io/instance: ingress-nginx
    309. app.kubernetes.io/version: 1.1.1
    310. app.kubernetes.io/managed-by: Helm
    311. app.kubernetes.io/component: controller
    312. name: ingress-nginx-controller
    313. namespace: ingress-nginx
    314. spec:
    315. selector:
    316. matchLabels:
    317. app.kubernetes.io/name: ingress-nginx
    318. app.kubernetes.io/instance: ingress-nginx
    319. app.kubernetes.io/component: controller
    320. revisionHistoryLimit: 10
    321. minReadySeconds: 0
    322. template:
    323. metadata:
    324. labels:
    325. app.kubernetes.io/name: ingress-nginx
    326. app.kubernetes.io/instance: ingress-nginx
    327. app.kubernetes.io/component: controller
    328. annotations:
    329. spec:
    330. dnsPolicy: ClusterFirst
    331. nodeName: k8s-node2
    332. containers:
    333. - name: controller
    334. image: registry.cn-hangzhou.aliyuncs.com/google_containers/nginx-ingress-controller:v1.1.1
    335. imagePullPolicy: IfNotPresent
    336. lifecycle:
    337. preStop:
    338. exec:
    339. command:
    340. - /wait-shutdown
    341. args:
    342. - /nginx-ingress-controller
    343. - --publish-service=$(POD_NAMESPACE)/ingress-nginx-controller
    344. - --election-id=ingress-controller-leader
    345. - --controller-class=k8s.io/ingress-nginx
    346. - --configmap=$(POD_NAMESPACE)/ingress-nginx-controller
    347. - --validating-webhook=:8443
    348. - --validating-webhook-certificate=/usr/local/certificates/cert
    349. - --validating-webhook-key=/usr/local/certificates/key
    350. securityContext:
    351. capabilities:
    352. drop:
    353. - ALL
    354. add:
    355. - NET_BIND_SERVICE
    356. runAsUser: 101
    357. allowPrivilegeEscalation: true
    358. env:
    359. - name: POD_NAME
    360. valueFrom:
    361. fieldRef:
    362. fieldPath: metadata.name
    363. - name: POD_NAMESPACE
    364. valueFrom:
    365. fieldRef:
    366. fieldPath: metadata.namespace
    367. - name: LD_PRELOAD
    368. value: /usr/local/lib/libmimalloc.so
    369. livenessProbe:
    370. failureThreshold: 5
    371. httpGet:
    372. path: /healthz
    373. port: 10254
    374. scheme: HTTP
    375. initialDelaySeconds: 10
    376. periodSeconds: 10
    377. successThreshold: 1
    378. timeoutSeconds: 1
    379. readinessProbe:
    380. failureThreshold: 3
    381. httpGet:
    382. path: /healthz
    383. port: 10254
    384. scheme: HTTP
    385. initialDelaySeconds: 10
    386. periodSeconds: 10
    387. successThreshold: 1
    388. timeoutSeconds: 1
    389. ports:
    390. - name: http
    391. containerPort: 80
    392. hostPort: 80
    393. protocol: TCP
    394. - name: https
    395. containerPort: 443
    396. hostPort: 443
    397. protocol: TCP
    398. - name: webhook
    399. containerPort: 8443
    400. protocol: TCP
    401. volumeMounts:
    402. - name: webhook-cert
    403. mountPath: /usr/local/certificates/
    404. readOnly: true
    405. resources:
    406. requests:
    407. cpu: 100m
    408. memory: 90Mi
    409. nodeSelector:
    410. kubernetes.io/os: linux
    411. serviceAccountName: ingress-nginx
    412. terminationGracePeriodSeconds: 300
    413. volumes:
    414. - name: webhook-cert
    415. secret:
    416. secretName: ingress-nginx-admission
    417. ---
    418. # Source: ingress-nginx/templates/controller-ingressclass.yaml
    419. # We don't support namespaced ingressClass yet
    420. # So a ClusterRole and a ClusterRoleBinding is required
    421. apiVersion: networking.k8s.io/v1
    422. kind: IngressClass
    423. metadata:
    424. labels:
    425. helm.sh/chart: ingress-nginx-4.0.15
    426. app.kubernetes.io/name: ingress-nginx
    427. app.kubernetes.io/instance: ingress-nginx
    428. app.kubernetes.io/version: 1.1.1
    429. app.kubernetes.io/managed-by: Helm
    430. app.kubernetes.io/component: controller
    431. name: nginx
    432. namespace: ingress-nginx
    433. spec:
    434. controller: k8s.io/ingress-nginx
    435. ---
    436. # Source: ingress-nginx/templates/admission-webhooks/validating-webhook.yaml
    437. # before changing this value, check the required kubernetes version
    438. # https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/#prerequisites
    439. apiVersion: admissionregistration.k8s.io/v1
    440. kind: ValidatingWebhookConfiguration
    441. metadata:
    442. labels:
    443. helm.sh/chart: ingress-nginx-4.0.15
    444. app.kubernetes.io/name: ingress-nginx
    445. app.kubernetes.io/instance: ingress-nginx
    446. app.kubernetes.io/version: 1.1.1
    447. app.kubernetes.io/managed-by: Helm
    448. app.kubernetes.io/component: admission-webhook
    449. name: ingress-nginx-admission
    450. webhooks:
    451. - name: validate.nginx.ingress.kubernetes.io
    452. matchPolicy: Equivalent
    453. rules:
    454. - apiGroups:
    455. - networking.k8s.io
    456. apiVersions:
    457. - v1
    458. operations:
    459. - CREATE
    460. - UPDATE
    461. resources:
    462. - ingresses
    463. failurePolicy: Fail
    464. sideEffects: None
    465. admissionReviewVersions:
    466. - v1
    467. clientConfig:
    468. service:
    469. namespace: ingress-nginx
    470. name: ingress-nginx-controller-admission
    471. path: /networking/v1/ingresses
    472. ---
    473. # Source: ingress-nginx/templates/admission-webhooks/job-patch/serviceaccount.yaml
    474. apiVersion: v1
    475. kind: ServiceAccount
    476. metadata:
    477. name: ingress-nginx-admission
    478. namespace: ingress-nginx
    479. annotations:
    480. helm.sh/hook: pre-install,pre-upgrade,post-install,post-upgrade
    481. helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded
    482. labels:
    483. helm.sh/chart: ingress-nginx-4.0.15
    484. app.kubernetes.io/name: ingress-nginx
    485. app.kubernetes.io/instance: ingress-nginx
    486. app.kubernetes.io/version: 1.1.1
    487. app.kubernetes.io/managed-by: Helm
    488. app.kubernetes.io/component: admission-webhook
    489. ---
    490. # Source: ingress-nginx/templates/admission-webhooks/job-patch/clusterrole.yaml
    491. apiVersion: rbac.authorization.k8s.io/v1
    492. kind: ClusterRole
    493. metadata:
    494. name: ingress-nginx-admission
    495. annotations:
    496. helm.sh/hook: pre-install,pre-upgrade,post-install,post-upgrade
    497. helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded
    498. labels:
    499. helm.sh/chart: ingress-nginx-4.0.15
    500. app.kubernetes.io/name: ingress-nginx
    501. app.kubernetes.io/instance: ingress-nginx
    502. app.kubernetes.io/version: 1.1.1
    503. app.kubernetes.io/managed-by: Helm
    504. app.kubernetes.io/component: admission-webhook
    505. rules:
    506. - apiGroups:
    507. - admissionregistration.k8s.io
    508. resources:
    509. - validatingwebhookconfigurations
    510. verbs:
    511. - get
    512. - update
    513. ---
    514. # Source: ingress-nginx/templates/admission-webhooks/job-patch/clusterrolebinding.yaml
    515. apiVersion: rbac.authorization.k8s.io/v1
    516. kind: ClusterRoleBinding
    517. metadata:
    518. name: ingress-nginx-admission
    519. annotations:
    520. helm.sh/hook: pre-install,pre-upgrade,post-install,post-upgrade
    521. helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded
    522. labels:
    523. helm.sh/chart: ingress-nginx-4.0.15
    524. app.kubernetes.io/name: ingress-nginx
    525. app.kubernetes.io/instance: ingress-nginx
    526. app.kubernetes.io/version: 1.1.1
    527. app.kubernetes.io/managed-by: Helm
    528. app.kubernetes.io/component: admission-webhook
    529. roleRef:
    530. apiGroup: rbac.authorization.k8s.io
    531. kind: ClusterRole
    532. name: ingress-nginx-admission
    533. subjects:
    534. - kind: ServiceAccount
    535. name: ingress-nginx-admission
    536. namespace: ingress-nginx
    537. ---
    538. # Source: ingress-nginx/templates/admission-webhooks/job-patch/role.yaml
    539. apiVersion: rbac.authorization.k8s.io/v1
    540. kind: Role
    541. metadata:
    542. name: ingress-nginx-admission
    543. namespace: ingress-nginx
    544. annotations:
    545. helm.sh/hook: pre-install,pre-upgrade,post-install,post-upgrade
    546. helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded
    547. labels:
    548. helm.sh/chart: ingress-nginx-4.0.15
    549. app.kubernetes.io/name: ingress-nginx
    550. app.kubernetes.io/instance: ingress-nginx
    551. app.kubernetes.io/version: 1.1.1
    552. app.kubernetes.io/managed-by: Helm
    553. app.kubernetes.io/component: admission-webhook
    554. rules:
    555. - apiGroups:
    556. - ''
    557. resources:
    558. - secrets
    559. verbs:
    560. - get
    561. - create
    562. ---
    563. # Source: ingress-nginx/templates/admission-webhooks/job-patch/rolebinding.yaml
    564. apiVersion: rbac.authorization.k8s.io/v1
    565. kind: RoleBinding
    566. metadata:
    567. name: ingress-nginx-admission
    568. namespace: ingress-nginx
    569. annotations:
    570. helm.sh/hook: pre-install,pre-upgrade,post-install,post-upgrade
    571. helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded
    572. labels:
    573. helm.sh/chart: ingress-nginx-4.0.15
    574. app.kubernetes.io/name: ingress-nginx
    575. app.kubernetes.io/instance: ingress-nginx
    576. app.kubernetes.io/version: 1.1.1
    577. app.kubernetes.io/managed-by: Helm
    578. app.kubernetes.io/component: admission-webhook
    579. roleRef:
    580. apiGroup: rbac.authorization.k8s.io
    581. kind: Role
    582. name: ingress-nginx-admission
    583. subjects:
    584. - kind: ServiceAccount
    585. name: ingress-nginx-admission
    586. namespace: ingress-nginx
    587. ---
    588. # Source: ingress-nginx/templates/admission-webhooks/job-patch/job-createSecret.yaml
    589. apiVersion: batch/v1
    590. kind: Job
    591. metadata:
    592. name: ingress-nginx-admission-create
    593. namespace: ingress-nginx
    594. annotations:
    595. helm.sh/hook: pre-install,pre-upgrade
    596. helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded
    597. labels:
    598. helm.sh/chart: ingress-nginx-4.0.15
    599. app.kubernetes.io/name: ingress-nginx
    600. app.kubernetes.io/instance: ingress-nginx
    601. app.kubernetes.io/version: 1.1.1
    602. app.kubernetes.io/managed-by: Helm
    603. app.kubernetes.io/component: admission-webhook
    604. spec:
    605. template:
    606. metadata:
    607. name: ingress-nginx-admission-create
    608. labels:
    609. helm.sh/chart: ingress-nginx-4.0.15
    610. app.kubernetes.io/name: ingress-nginx
    611. app.kubernetes.io/instance: ingress-nginx
    612. app.kubernetes.io/version: 1.1.1
    613. app.kubernetes.io/managed-by: Helm
    614. app.kubernetes.io/component: admission-webhook
    615. spec:
    616. containers:
    617. - name: create
    618. image: registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.1.1
    619. imagePullPolicy: IfNotPresent
    620. args:
    621. - create
    622. - --host=ingress-nginx-controller-admission,ingress-nginx-controller-admission.$(POD_NAMESPACE).svc
    623. - --namespace=$(POD_NAMESPACE)
    624. - --secret-name=ingress-nginx-admission
    625. env:
    626. - name: POD_NAMESPACE
    627. valueFrom:
    628. fieldRef:
    629. fieldPath: metadata.namespace
    630. securityContext:
    631. allowPrivilegeEscalation: false
    632. restartPolicy: OnFailure
    633. serviceAccountName: ingress-nginx-admission
    634. nodeSelector:
    635. kubernetes.io/os: linux
    636. securityContext:
    637. runAsNonRoot: true
    638. runAsUser: 2000
    639. ---
    640. # Source: ingress-nginx/templates/admission-webhooks/job-patch/job-patchWebhook.yaml
    641. apiVersion: batch/v1
    642. kind: Job
    643. metadata:
    644. name: ingress-nginx-admission-patch
    645. namespace: ingress-nginx
    646. annotations:
    647. helm.sh/hook: post-install,post-upgrade
    648. helm.sh/hook-delete-policy: before-hook-creation,hook-succeeded
    649. labels:
    650. helm.sh/chart: ingress-nginx-4.0.15
    651. app.kubernetes.io/name: ingress-nginx
    652. app.kubernetes.io/instance: ingress-nginx
    653. app.kubernetes.io/version: 1.1.1
    654. app.kubernetes.io/managed-by: Helm
    655. app.kubernetes.io/component: admission-webhook
    656. spec:
    657. template:
    658. metadata:
    659. name: ingress-nginx-admission-patch
    660. labels:
    661. helm.sh/chart: ingress-nginx-4.0.15
    662. app.kubernetes.io/name: ingress-nginx
    663. app.kubernetes.io/instance: ingress-nginx
    664. app.kubernetes.io/version: 1.1.1
    665. app.kubernetes.io/managed-by: Helm
    666. app.kubernetes.io/component: admission-webhook
    667. spec:
    668. containers:
    669. - name: patch
    670. image: registry.cn-hangzhou.aliyuncs.com/google_containers/kube-webhook-certgen:v1.1.1
    671. imagePullPolicy: IfNotPresent
    672. args:
    673. - patch
    674. - --webhook-name=ingress-nginx-admission
    675. - --namespace=$(POD_NAMESPACE)
    676. - --patch-mutating=false
    677. - --secret-name=ingress-nginx-admission
    678. - --patch-failure-policy=Fail
    679. env:
    680. - name: POD_NAMESPACE
    681. valueFrom:
    682. fieldRef:
    683. fieldPath: metadata.namespace
    684. securityContext:
    685. allowPrivilegeEscalation: false
    686. restartPolicy: OnFailure
    687. serviceAccountName: ingress-nginx-admission
    688. nodeSelector:
    689. kubernetes.io/os: linux
    690. securityContext:
    691. runAsNonRoot: true
    692. runAsUser: 2000

    2.2 部署 Ingress

    把 ingress-deployment.yaml 文件上传到 Kubernetes 集群的 master 节点,执行命令部署 Ingress。

    kubectl apply -f ingress-deployment.yaml
    

    步骤 3: 部署 Nginx

    3.1 编写 nginx-deployment.yaml

    1. apiVersion: apps/v1
    2. kind: Deployment
    3. metadata:
    4. name: nginx-deployment
    5. spec:
    6. selector:
    7. matchLabels:
    8. app: backend
    9. replicas: 1
    10. template:
    11. metadata:
    12. labels:
    13. app: backend
    14. spec:
    15. nodeName: k8s-node2
    16. containers:
    17. - name: nginx
    18. image: nginx:latest
    19. resources:
    20. limits:
    21. memory: "128Mi"
    22. cpu: "128m"
    23. ports:
    24. - containerPort: 80
    25. ---
    26. apiVersion: v1
    27. kind: Service
    28. metadata:
    29. name: nginx-service
    30. spec:
    31. selector:
    32. app: backend
    33. ports:
    34. - port: 80
    35. targetPort: 80

    3.2 编写 nginx-ingress.yaml

    1. apiVersion: networking.k8s.io/v1
    2. kind: Ingress
    3. metadata:
    4. name: nodeport-ingress
    5. namespace: default
    6. annotations:
    7. kubernetes.io/ingress.class: "nginx"
    8. spec:
    9. rules:
    10. - host: mynginx.com
    11. http:
    12. paths:
    13. - pathType: Prefix
    14. path: /
    15. backend:
    16. service:
    17. name: nginx-service
    18. port:
    19. number: 80

    3.3 部署 Nginx

    把 nginx-deployment.yaml 和 nginx-ingress.yaml 上传到 Kubernetes 集群的 master 节点,执行命令。

    1. kubectl apply -f nginx-deployment.yaml
    2. kubectl apply -f nginx-ingress.yaml

    步骤 4: 创建 CRD

    4.1 编写 datakit-crd.yaml

    1. apiVersion: apiextensions.k8s.io/v1
    2. kind: CustomResourceDefinition
    3. metadata:
    4. name: datakits.guance.com
    5. spec:
    6. group: guance.com
    7. versions:
    8. - name: v1beta1
    9. served: true
    10. storage: true
    11. schema:
    12. openAPIV3Schema:
    13. type: object
    14. properties:
    15. spec:
    16. type: object
    17. properties:
    18. instances:
    19. type: array
    20. items:
    21. type: object
    22. properties:
    23. k8sNamespace:
    24. type: string
    25. k8sDeployment:
    26. type: string
    27. datakit/logs:
    28. type: string
    29. inputConf:
    30. type: string
    31. scope: Namespaced
    32. names:
    33. plural: datakits
    34. singular: datakit
    35. kind: Datakit
    36. shortNames:
    37. - dk

    4.2 编写 ingress-crd.yaml

    1. apiVersion: "guance.com/v1beta1"
    2. kind: Datakit
    3. metadata:
    4. name: prom-ingress
    5. namespace: datakit
    6. spec:
    7. instances:
    8. - k8sNamespace: "ingress-nginx"
    9. k8sDeployment: "ingress-nginx-controller"
    10. inputConf: |
    11. [[inputs.prom]]
    12. url = "http://$IP:10254/metrics"
    13. source = "prom-ingress"
    14. metric_types = ["counter", "gauge","histogram"]
    15. # metric_name_filter = ["cpu"]
    16. # measurement_prefix = ""
    17. measurement_name = "prom_ingress"
    18. interval = "60s"
    19. tags_ignore = ["build","le","path","method","release","repository"]
    20. metric_name_filter = ["nginx_process_cpu_seconds_total","nginx_process_resident_memory_bytes","request_size","response_size","requests","success","config_last_reload_successful"]
    21. [[inputs.prom.measurements]]
    22. prefix = "nginx_ingress_controller_"
    23. name = "prom_ingress"
    24. [inputs.prom.tags]
    25. namespace = "$NAMESPACE"

    4.3 部署 CRD

    把文件上传到 Kubernets 集群的 master 节点,执行命令。

    1. kubectl apply -f datakit-crd.yaml
    2. kubectl apply -f ingress-crd.yaml

    步骤 5: 场景视图

    5.1 访问 nginx

    执行 kubectl get svc -n ingress-nginx 获取到 80 对应的节点端口是 30049。

    使用节点 8.136.207.182 来访问 Nginx。

    while true; do sleep 1;curl -v http://8.136.207.182 -H 'host: mynginx.com'; done
    

    5.2 Ingress 可观测

    登录『观测云』,点击『场景』模块,新建仪表板,搜索 ingress,点击『确定』。

    上步执行的 while 命令会模拟访问 mynginx.com,监控视图展示出 Ingress 的使用情况。

  • 相关阅读:
    Java IO之网络的简介说明
    终于辞职了,全职ue了
    java IO流 序列化流
    软件开发项目文档系列之五如何撰写需求规格说明书
    mybatis动态表名
    QT定时器简单应用
    【CVPR 2022】NeRFReN: Neural Radiance Fields with Reflections
    Sketch在mac运行时崩溃,什么是安全模式以及如何启用它?
    【OAuth2】十五、客户端认证流程-自定义授权页面和客户端认证
    主辅助服务市场出清模型研究【旋转备用】(Matlab代码实现)
  • 原文地址:https://blog.csdn.net/DataFlux/article/details/126727973