ตั้งค่า Registry Docker ส่วนตัวด้วย TLS บน Kubernetes - Civo.com (2023)

บทช่วยสอนนี้จะแสดงวิธีการปรับใช้รีจิสทรีของคุณเองบน Kubernetes เพื่อจัดเก็บอิมเมจ Docker คุณจะได้เรียนรู้วิธีการตั้งค่าใบรับรอง TLSซึ่งจะออกให้ฟรีจากLetsEncrypt.org.

สถาปัตยกรรมเชิงแนวคิด

ตั้งค่า Registry Docker ส่วนตัวด้วย TLS บน Kubernetes - Civo.com (1)

คุณจะได้เรียนรู้ว่าแต่ละส่วนในภาพด้านบนทำงานร่วมกันอย่างไรโดยทำตามบทช่วยสอน

ฉันต้องการรีจิสตรีคอนเทนเนอร์ของฉันเองหรือไม่

วัตถุประสงค์หลักของการลงทะเบียนคอนเทนเนอร์คือการจัดเก็บและโฮสต์อาร์ติแฟกต์ที่บรรจุในรูปแบบ Docker หรือ OCI-image.

ในปัจจุบันมีการจัดการการลงทะเบียนสำหรับอิมเมจคอนเทนเนอร์ที่นำเสนอโดยผู้ให้บริการระบบคลาวด์เกือบทุกราย แม้แต่บริษัทที่ไม่ได้ให้บริการทรัพยากรคอมพิวเตอร์ก็เริ่มให้บริการการลงทะเบียน เช่นเจกบ,GitLab.คอม,นักเทียบท่าอิงค์, และGitHub.คอม.

เหตุใดคุณจึงต้องการตั้งค่าของคุณเอง นี่คือเหตุผลบางประการ:

เวลาแฝง:การโฮสต์รีจิสทรีภายในคลัสเตอร์ Kubernetes เป็นวิธีที่เร็วที่สุดในการพุชและดึงอิมเมจ สิ่งนี้สำคัญสำหรับกรณีการใช้งาน เช่น การปรับขนาดอัตโนมัติ และส่งผลต่อความเร็วโดยรวมในการปรับใช้จากไปป์ไลน์ CI/CD

ค่าใช้จ่าย:แบนด์วิธเข้าและออกจากดาต้าเซ็นเตอร์แทบจะไม่ฟรี นับประสาอะไรกับภูมิภาคต่างๆ การโฮสต์อิมเมจ Docker ที่ผลิตและใช้งานทำให้ต้นทุนต่ำที่สุด

ข้อบังคับ:ข้อบังคับและข้อจำกัดทางกฎหมายบางอย่าง เช่น GDPR อาจหมายความว่าการจัดเก็บสิ่งประดิษฐ์กับผู้ให้บริการ SaaS นั้นไม่สามารถทำได้

ความปลอดภัย:แม้ว่าเราจะไม่ได้สำรวจในขอบเขตของบทช่วยสอนนี้ แต่สามารถเพิ่มความปลอดภัยเพิ่มเติมให้กับการลงทะเบียนที่โฮสต์เองโดยใช้ซอฟต์แวร์โอเพ่นซอร์ส เช่นท่าเรือ CNCF. Harbour สแกนอิมเมจ Docker สำหรับCVEและช่องโหว่อื่นๆ

ระบบอัตโนมัติและการพกพา:คุณอาจทำให้รีจิสทรีที่โฮสต์บน AWS เป็นแบบอัตโนมัติได้ แต่ต้องใช้รหัสที่แตกต่างกันโดยสิ้นเชิงเพื่อทำให้รีจิสทรีบน GCP เป็นแบบอัตโนมัติ ด้วยการใช้รีจีสทรีแบบโอเพ่นซอร์สที่เราสามารถโฮสต์ได้เอง ทำให้เราพกพาได้อีกครั้ง ทำให้คุณสามารถโฮสต์โปรเจกต์ของคุณได้ทุกที่ที่คุณต้องการ

สะดวกในการใช้:การรวมหนึ่งรายการขึ้นไปเข้ากับคลัสเตอร์ Kubernetes ที่มีอยู่ในพื้นที่พร้อมใช้งานที่คุณเลือกนั้นค่อนข้างง่าย

ข้อกำหนดเบื้องต้น

  • ชื่อโดเมนหรือโดเมนย่อยที่คุณเป็นเจ้าของ คุณต้องสามารถอัปเดตได้ระเบียน DNS Aสำหรับโดเมนของคุณ ตัวอย่างเช่น คุณสามารถซื้อได้ที่domains.google. คุณสามารถที่จะจัดการ DNS ผ่าน Civo.

  • นักเทียบท่า- เราจะใช้คอนเทนเนอร์ Docker เพื่อสร้างการกำหนดค่าบางอย่างของเรา

  • Kubernetes- บทช่วยสอนนี้เขียนขึ้นโดยคำนึงถึง k3s แต่ยังใช้งานได้กับ Kubernetes เต็มรูปแบบด้วยการปรับแต่งเล็กน้อย

หากคุณเป็นผู้ใช้ Civo เราจะโฮสต์รีจิสทรีของเราบนซีโว คลาวด์. คุณสามารถใช้ได้k3sup (ซอสมะเขือเทศ)เพื่อปรับใช้ Kubernetes บนอินสแตนซ์ของคุณเองภายในไม่กี่นาที

หมายเหตุ: หากคุณกำลังใช้k3sคุณสามารถข้ามการติดตั้ง Nginx IngressController

กวดวิชา

เราจะติดตั้งก่อนหางเสือ, แล้วไถนาจากนั้นผู้ใช้ Kubernetes จะสามารถเพิ่มได้งินซ์ในเจ้าภาพผู้ใช้โหมดและ k3s สามารถข้ามขั้นตอนนี้ได้เนื่องจากจะใช้การจราจร. หลังจากนั้น เราจะเพิ่ม cert-manager และ Issuer เพื่อรับใบรับรอง ตามด้วยการลงทะเบียน หลังจากติดตั้งทุกอย่างแล้ว เราสามารถใช้รีจิสทรีของเราได้โดยใช้รหัสผ่านที่สร้างขึ้นระหว่างการสอน คุณจะปิดท้ายด้วยการทดสอบทุกอย่างตั้งแต่ต้นทางจนถึงปลายทาง และหากคุณติดขัด เรามีเคล็ดลับที่เป็นประโยชน์ในการแก้ปัญหา

ส่วนประกอบบางอย่างได้รับการติดตั้งในเนมสเปซของตนเอง เช่น cert-manager ส่วนส่วนประกอบอื่นๆ ทั้งหมดจะถูกติดตั้งลงในค่าเริ่มต้นเนมสเปซ คุณสามารถควบคุมเนมสเปซด้วยkubectl รับ --namespace/-n NAMEหรือkubectl รับ --all-namespaces/-A.

นอกจากนี้ยังมีวิธีการบางส่วนในการกวดวิชาเพิ่มเติมในภาคผนวก

ติดตั้งหางเสือ CLI/ไคลเอ็นต์

ในการติดตั้งล่าสุดหางเสือ,บน MacOS และ Linux::

ขด https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get | ทุบตี

หรือผ่าน Homebrew บน MacOS:

ชงติดตั้ง kubernetes-helm

สำหรับผู้ใช้ Windows ให้ไปที่หางเสือ.

ติดตั้งเครื่องไถพรวน

สร้างสิทธิ์การควบคุมการเข้าถึงตามบทบาท (RBAC) สำหรับผู้ไถพรวนดิน:

kubectl -n kube-system สร้าง sa ไถพรวน \ && kubectl สร้างคลัสเตอร์บทบาทผูกพันไถนา \ --clusterrole คลัสเตอร์ผู้ดูแลระบบ \ --serviceaccount=kube-system:tiller

ติดตั้งคอมโพเนนต์ Tiller ฝั่งเซิร์ฟเวอร์บนคลัสเตอร์ของคุณ:

helm init --skip-refresh --upgrade --service-บัญชีหางเสือ

หมายเหตุ: ขั้นตอนนี้จะติดตั้งคอมโพเนนต์เซิร์ฟเวอร์ในคลัสเตอร์ของคุณ อาจใช้เวลาระหว่างไม่กี่วินาทีถึงสองสามนาทีในการติดตั้งอย่างถูกต้อง คุณควรเห็นหางเสือปรากฏบน:kubectl รับพ็อด -n ระบบ kube.

ตอนนี้รอให้ไถพรวนพร้อม:

สถานะการเปิดตัว kubectl -n การปรับใช้ระบบ kube/tiller-deploydeployment "tiller-deploy" เปิดตัวสำเร็จแล้ว

IngressController ในตัวของคุณด้วย k3s

k3s มาพร้อมกับโหลดบาลานเซอร์ที่เรียกว่าการจราจร. หากคุณไม่ได้ใช้บริการ k3s เราจะต้องตั้งค่า IngressController

สำหรับ k3s อย่าติดตั้ง IngressController คุณมีอยู่แล้ว ข้ามไปได้เลย

เพิ่ม IngressController หากไม่ได้ใช้ k3s

หากคุณไม่ได้ใช้ k3sจากนั้นติดตั้ง Nginx Ingress แทน:

หางเสือติดตั้งเสถียร / nginx-ingress --name nginxingress --set rbac.create=true,controller.hostNetwork=true,controller.daemonset.useHostPort=true,dnsPolicy=ClusterFirstWithHostNet,controller.kind=DaemonSet

ติดตั้ง cert-manager

ตอนนี้คุณสามารถติดตั้ง cert-manager เวอร์ชันที่ใช้ในคู่มือนี้คือ v0.9.1 ตรวจสอบได้ที่หน้าผู้จัดการใบรับรองสำหรับหมายเลขเวอร์ชันที่เหมาะสมเพื่อแก้ไขเป็นคำสั่งด้านล่าง

# ติดตั้งทรัพยากร CustomResourceDefinition แยกกันใช้ kubectl --validate=false -f https://raw.githubusercontent.com/jetstack/cert-manager/v0.13.1/deploy/manifests/00-crds.yaml# สร้างเนมสเปซสำหรับ cert- managerkubectl สร้างเนมสเปซ cert-manager# เลเบลเนมสเปซ cert-manager เพื่อปิดใช้งานการตรวจสอบทรัพยากร ฉลากเนมสเปซ kubectl cert-manager certmanager.k8s.io/disable-validation=true# เพิ่มที่เก็บ Jetstack Helmhelm repo เพิ่ม jetstack https://charts.jetstack io# อัปเดตที่เก็บแผนภูมิ Helm ในเครื่องของคุณ cachehelm repo update# ติดตั้ง cert-manager Helm charthelm ติดตั้ง \ --name cert-manager \ --namespace cert-manager \ --version v0.9.1 \ jetstack/cert-manager

ดูสิ่งนี้ด้วย:cert-manager v0.9.0 เอกสาร

สร้าง ClusterIssuer

วิธีที่ cert-manager ออกใบรับรองคือผ่านผู้ออก. เดอะผู้ออกสามารถออกใบรับรองสำหรับเนมสเปซที่สร้างขึ้นได้ แต่กผู้ออกคลัสเตอร์สามารถสร้างใบรับรองสำหรับเนมสเปซใดก็ได้ ดังนั้นนั่นคือสิ่งที่เราจะใช้ในวันนี้

บันทึกต่อไปนี้เป็นIssuer.yaml:

apiVersion: certmanager.k8s.io/v1alpha2kind: ClusterIssuermetadata: ชื่อ: letsencrypt-prod namespace: defaultspec: acme: # เซิร์ฟเวอร์ URL ของเซิร์ฟเวอร์ ACME: https://acme-v02.api.letsencrypt.org/directory # ที่อยู่อีเมลที่ใช้สำหรับ อีเมลลงทะเบียน ACME: user@example.com # ชื่อของความลับที่ใช้ในการจัดเก็บคีย์ส่วนตัวของบัญชี ACME privateKeySecretRef: ชื่อ: letsencrypt-prod # เปิดใช้งานตัวแก้ปัญหาผู้ให้บริการ HTTP-01: - http01: ingress: class: traefik
  • แก้ไขไฟล์:

แก้ไขบรรทัด:อีเมล: user@example.comเพื่อใช้ที่อยู่อีเมลของคุณ

หากใช้ Nginx แทน k3s และ Traefik ให้แก้ไขสิ่งต่อไปนี้:

ตัวแก้ปัญหา: - http01: ขาเข้า: คลาส: nginx

จากนั้นเรียกใช้kubectl ใช้ -f issuer.yaml.

โปรดทราบว่าคุณอาจได้รับข้อผิดพลาด หากคุณรอ 1-2 นาทีแล้วลองอีกครั้งในขณะที่ cert-manager ลงทะเบียนตัวเอง

คุณสามารถตรวจสอบสถานะของผู้ออกได้ดังนี้:

kubectl อธิบาย clusterissuer/letsencrypt-prod

มองหามันจะกลายเป็นพร้อม.

กำหนดค่า DNS

สำหรับบทช่วยสอนนี้ โดเมนon-k3s.devถูกซื้อจาก Google Domains เพื่อแสดงตัวอย่างการทำงาน หากคุณใช้ผู้รับจดทะเบียนโดเมนรายอื่น หน้าจอต่อไปนี้จะดูคล้ายกันมาก

ตั้งค่า Registry Docker ส่วนตัวด้วย TLS บน Kubernetes - Civo.com (2)

เมื่อคุณซื้อโดเมนของคุณแล้ว คุณต้องชี้ระเบียน DNS ไปที่โฮสต์ในคลัสเตอร์ k3s ที่ Nginx กำลังจะฟังบนพอร์ต 80 (HTTP) และพอร์ต 443 (HTTPS/TLS)

ตั้งค่า Registry Docker ส่วนตัวด้วย TLS บน Kubernetes - Civo.com (3)

คุณสามารถค้นหาที่อยู่ IP ของคุณด้วย Civo Dashboard UI หรือพิมพ์ตัวอย่าง civo lsผ่านซีแอลไอ.

ติดตั้งรีจิสทรี

ในขั้นตอนนี้เราสามารถติดตั้งรีจิสทรีได้ แต่เราจะติดตั้งโดยไม่ใช้ความพยายาม หากคุณต้องการความคงอยู่ให้ดูภาคผนวกสำหรับวิธีการทำ

บันทึกต่อไปนี้เป็นติดตั้ง Registry.sh:

ส่งออก SHA=$(head -c 16 /dev/urandom | shasum | cut -d " " -f 1)export USER=adminecho $USER > Registry-creds.txtecho $SHA >> Registry-creds.txtdocker run --entrypoint รีจิสทรี htpasswd:2 -Bbn ผู้ดูแลระบบ $SHA > ./htpasswdhelm ติดตั้งเสถียร/นักเทียบท่า-รีจิสทรี \ --name ทะเบียนส่วนตัว \ --namespace เริ่มต้น \ --setคงอยู่.เปิดใช้งาน=เท็จ \ --set secrets.htpasswd=$( แมว./htpasswd)

คุณจะต้องมีนักเทียบท่าติดตั้งและพร้อมสำหรับขั้นตอนนี้ ถ้ายังไม่เริ่ม ให้เริ่มเลย

จากนั้นเรียกใช้สคริปต์:

chmod +x install-registry.sh./install-registry.sh

มันจะติดตั้งรีจิสทรี Docker จากรีจิสทรีนักเทียบท่าแผนภูมิ.

ในภายหลัง เมื่อคุณต้องการใช้รีจิสทรี คุณสามารถค้นหาชื่อผู้ใช้และรหัสผ่านของคุณได้ในรีจิสทรี-creds.txtไฟล์.

รับใบรับรอง TLS สำหรับรีจิสทรี

ตอนนี้มารับใบรับรอง TLS สำหรับรีจิสทรี

บันทึกingress.yamlแล้วแก้ไข:

---apiVersion: extensions/v1beta1kind: Ingressmetadata: ชื่อ: register namespace: คำอธิบายประกอบเริ่มต้น: certmanager.k8s.io/cluster-issuer: letsencrypt-prod kubernetes.io/ingress.class: "traefik" nginx.ingress.kubernetes.io /proxy-body-size: 50m ป้ายกำกับ: แอป: docker-registryspec: tls: - โฮสต์: - Registry.example.com secretName: Registry.example.com-cert กฎ: - โฮสต์: Registry.example.com http: เส้นทาง: - เส้นทาง: / แบ็กเอนด์: serviceName: private-registry-docker-registry servicePort: 5000

อัปเดตไฟล์:

  • ทุกที่ที่คุณเห็นRegistry.example.comให้แทนที่ด้วยโดเมนของคุณ
  • หากใช้ Nginx ให้เปลี่ยนบรรทัดนี้:kubernetes.io/ingress.class:เพื่อพูด"นิงซ์"

หมายเหตุการตั้งค่าพิเศษ:.ingress.kubernetes.io/proxy-body-size: 50m. ค่านี้สามารถปรับแต่งได้และอนุญาตให้จัดเก็บอิมเมจ Docker ขนาดใหญ่ในรีจิสตรี

ตอนนี้เรียกใช้:

kubectl ใช้ -f ingress.yaml

ตรวจสอบใบรับรอง

ตอนนี้ตรวจสอบใบรับรองด้วยสิ่งต่อไปนี้:

kubectl รับใบรับรอง -n defaultNAME READY SECRET AGEregistry.on-k3s.dev-cert True Registry.on-k3s.dev-cert 47 วินาที

สำหรับรายการใด ๆ ในรายการ คุณสามารถตรวจสอบสถานะกับkubectl อธิบาย:

kubectl อธิบาย cert/registry.on-k3s.dev-certStatus: เงื่อนไข: เวลาเปลี่ยนล่าสุด: 2019-08-29T13:26:20Z ข้อความ: ใบรับรองเป็นปัจจุบันและยังไม่หมดอายุ เหตุผล: สถานะพร้อม: จริง ประเภท: พร้อม ไม่ใช่ หลัง: 11-2019 2019T12:26:18ZEเหตุการณ์: พิมพ์อายุเหตุผลจากข้อความ ---- ------ ---- ---- ------- ใบรับรองผู้จัดการ 64s ที่สร้างขึ้นตามปกติสร้างขึ้นใหม่ คีย์ส่วนตัว Normal GenerateSelfSigned 64s cert-manager สร้างใบรับรองชั่วคราวที่ลงนามด้วยตนเอง Normal OrderCreated 63s cert-manager สร้างทรัพยากรคำสั่งซื้อ "registry.on-k3s.dev-cert-3194477141" Normal OrderComplete 31s cert-manager Order "registry.on-k3s.dev -cert-3194477141" เสร็จสมบูรณ์ ปกติใบรับรอง CertIssued 31s cert-manager ออกเรียบร้อยแล้ว

มองหาคำแนะนำในสถานะและเหตุการณ์ส่วน

ตอนนี้เรามาทดสอบรีจิสทรีกัน

ส่งออก DOCKER_PASSWORD="" # เติมข้อมูลนี้ด้วยรหัสผ่านของคุณที่ใช้ข้างต้นexport DOCKER_USERNAME="admin"export SERVER="registry.example.com"echo $DOCKER_PASSWORD | เข้าสู่ระบบนักเทียบท่า $SERVER --ชื่อผู้ใช้ $DOCKER_USERNAME --รหัสผ่าน-stdin

แทนที่ตัวอย่าง.คอมในคำสั่งข้างต้นกับโดเมนของคุณ

บางครั้งอาจใช้เวลาสักครู่เพื่อให้โดเมนใหม่ของคุณพร้อมใช้งาน หากเป็นโดเมนที่มีอยู่ บันทึก DNS ควรได้รับการซิงโครไนซ์แล้ว

เมื่อเข้าสู่ระบบแล้ว คุณสามารถแท็กรูปภาพจาก Docker Hub และส่งไปยังรีจิสทรีของคุณเอง

ส่งออก SERVER="registry.example.com" docker pull functions/figlet:latestdocker tag functions/figlet:latest $SERVER/functions/figlet:latestdocker push $SERVER/functions/figlet:latest

ตอนนี้เราสามารถเข้าสู่รีจิสตรีและพุชอิมเมจได้แล้ว เราต้องเปิดใช้งานสิ่งเดียวกันจากภายในคลัสเตอร์ของเรา สิ่งนี้ทำได้โดยการแนบความลับในการดึงรูปภาพเข้ากับบัญชีบริการของเนมสเปซ

ส่งออก DOCKER_PASSWORD="" # เติมข้อมูลนี้ด้วยรหัสผ่านของคุณที่ใช้ด้านบน ส่งออก DOCKER_USERNAME="admin"kubectl สร้างนักเทียบท่าลับ - รีจิสทรี my-private-repo \ --docker-username=$DOCKER_USERNAME \ --docker-password=$DOCKER_PASSWORD \ -- นักเทียบท่าเซิร์ฟเวอร์ = $SERVER \ --namespace เริ่มต้น

ตอนนี้แก้ไขบัญชีบริการและให้สิทธิ์ในการเข้าถึงข้อมูลลับ:

kubectl แก้ไขค่าเริ่มต้นของบัญชีบริการ -n ค่าเริ่มต้น

เพิ่มสิ่งต่อไปนี้และบันทึก:

imagePullSecrets:- ชื่อ: my-private-repo

หากต้องการตรวจสอบว่าพร้อมใช้งานใน Kubernetes ให้เรียกใช้สิ่งต่อไปนี้ฟังก์ชัน OpenFaaSซึ่งพิมพ์โลโก้ ASCII แล้วออก

ส่งออก SERVER=""kubectl run --rm -t -i figlet --restart Never --image $SERVER/functions/figlet:latest -- figlet Kubernetes _ __ _ _ | |/ / _| |__ ___ _ __ _ __ ___| |_ ___ ___ | ' / | | | '_ \ / _ \ '__| '_ \ / _ \ __/ _ \/ __|| . \ |_| | |_) | __/ | | | | | __/ || __/\__ \|_|\_\__,_|_.__/ \___|_| |_| |_|\___|\__\___||___/ pod "figlet" ถูกลบแล้ว

การดำเนินการนี้จะพิมพ์โลโก้ Kubernetes ในรูปแบบ ASCII จากนั้นจึงลบ Pod ที่ใช้เรียกใช้โค้ด

หากไม่ได้ผล ให้ค้นหาสาเหตุด้วยคำสั่งนี้:

kubectl รับเหตุการณ์ --sort-by=.metadata.creationTimestamp -n ค่าเริ่มต้น

การดำเนินการเพิ่มเติม (ภาคผนวก)

คุณสามารถดำเนินการเพิ่มเติมและเริ่มสำรวจกรณีการใช้งานขั้นสูงเพิ่มเติมสำหรับรีจิสทรีของคุณ

เปิดใช้งานการคงอยู่

เป็นสิ่งที่พึงประสงค์ แต่ไม่จำเป็นที่จะเปิดใช้งานการคงอยู่สำหรับรีจิสทรี เมื่อพร้อมใช้งาน การคงอยู่หมายความว่าหากรีจิสทรีขัดข้อง จะสามารถกู้คืนรูปภาพได้

มีสองเส้นทางในการเปิดใช้งานการคงอยู่

  • ใช้ S3 หรือบัคเก็ตที่เข้ากันได้กับ S3 S3 เป็นโปรโตคอลและมาตรฐานสำหรับจัดเก็บอ็อบเจกต์ คุณสามารถใช้ได้บัญชี AWSและ S3 เป็นข้อมูลสำรองสำหรับที่เก็บข้อมูลรีจิสทรีของคุณ หรือคุณสามารถทำได้ติดตั้ง Minio บนอินสแตนซ์ Civo ของคุณและใช้เป็นเป้าหมาย S3 แทน

  • ใช้ PersistentVolumes ใน Kubernetes Storage ใน Kubernetes มาในรูปของ Volumes เมื่อปริมาณไม่ชั่วคราว จะเรียกว่า PersistentVolumes หรือ (PVs) หากต้องการใช้ PV กับ k3 คุณจะต้องติดตั้งโครงการลองฮอร์นของแรนเชอร์.

แผนภูมิหางเสืออธิบายตัวเลือกสำหรับการใช้ PV หรือ S3:แผนภูมินักเทียบท่า-รีจิสทรี.

ห่อ

ขณะนี้เราได้สร้างคลัสเตอร์ Kubernetes โดยใช้ k3s และมีรีจิสทรีที่ใช้งานได้พร้อม TLS การตรวจสอบสิทธิ์ และ URL สาธารณะ

หางเสือให้แผนภูมิแก่เรา (ซอฟต์แวร์แพ็คเกจสำหรับ Kubernetes)รีจิสทรีนักเทียบท่าให้รีจิสทรีพร้อมการรับรองความถูกต้องแก่เราผู้จัดการใบรับรองให้ใบรับรอง TLS จาก LetsEncryptการจราจรถูกสร้างขึ้นใน k3s หรือเราใช้ Nginx บน Kubernetes ต้นทาง

ตอนนี้คุณสามารถแบ่งปันรีจิสทรีกับทีมของคุณหรือใช้ในไปป์ไลน์ CI/CD ของคุณโดยใช้เครื่องมือเช่น Jenkins เพื่อสร้างและจัดส่งอิมเมจ Docker คุณอาจต้องการลองติดตั้งซอฟต์แวร์อื่นเพื่อเริ่มสร้างแอปพลิเคชันบน Kubernetes เช่นOpenFaaS.

References

Top Articles
Latest Posts
Article information

Author: Domingo Moore

Last Updated: 12/17/2023

Views: 5891

Rating: 4.2 / 5 (53 voted)

Reviews: 92% of readers found this page helpful

Author information

Name: Domingo Moore

Birthday: 1997-05-20

Address: 6485 Kohler Route, Antonioton, VT 77375-0299

Phone: +3213869077934

Job: Sales Analyst

Hobby: Kayaking, Roller skating, Cabaret, Rugby, Homebrewing, Creative writing, amateur radio

Introduction: My name is Domingo Moore, I am a attractive, gorgeous, funny, jolly, spotless, nice, fantastic person who loves writing and wants to share my knowledge and understanding with you.