檢視 Kubernetes 的原始碼
←
Kubernetes
跳至導覽
跳至搜尋
由於以下原因,您無權編輯此頁面:
您請求的操作只有這個群組的使用者能使用:
使用者
您可以檢視並複製此頁面的原始碼。
'''Kubernetes'''是一套由[[Google]]所發展出來的佈署系統。 == 環境 == 這邊是以Ubuntu 18.04為基礎,在[[AWS]]上使用一台<code>c5.2xlarge</code>與五台<code>r5.large</code>測試(單master版本),或是再加上三台<code>t3.small</code>並且使用[[ELB]](多master版本)。 == 安裝 == 先安裝[[Docker]],然後安裝Kubernetes的套件: <syntaxhighlight lang="bash"> curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg; echo "deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /" | sudo tee /etc/apt/sources.list.d/kubernetes.list; sudo apt update; sudo apt install -y kubelet kubeadm kubectl </syntaxhighlight> == 單master版本設定 == 這邊使用[[Calico]]當作網路層: <syntaxhighlight lang="bash"> sudo kubeadm init --pod-network-cidr=192.168.0.0/16 </syntaxhighlight> 把上面執行結果輸出的命令拿到別台用<code>sudo</code>跑,像是這樣的指令: <syntaxhighlight lang="bash"> sudo kubeadm join a.b.c.d:6443 --token xxxxxx.xxxxxxxxxxxxxxxx --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx </syntaxhighlight> 接著回到當初跑<code>kubeadm init</code>的機器上,把設定檔放到自己目錄下: <syntaxhighlight lang="bash"> mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config </syntaxhighlight> 接下來啟用Calico設定: <syntaxhighlight lang="bash"> kubectl apply -f https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/rbac-kdd.yaml kubectl apply -f https://docs.projectcalico.org/v3.3/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml </syntaxhighlight> 設定好之後不會馬上通,可以用<code>kubectl get nodes --watch</code>可以看到機器會因為retry從<code>NotReady</code>變成<code>Ready</code>。 == 多master版本設定 == 大多數的設定與單master版本的設定相同,請參考前面對單master版本的說明。 在多master版本中需要三台主機確保HA,以及一組load balancer提供讓程式可以操作Kubernetes(預設為port 6443)。 由於我們的測試是在[[AWS]]上面,所以這邊使用了[[ELB]](Classic版本,Internal,僅使用TCP Proxy)來當作load balancer(即下面設定中的<code>internal-test-gslin-k8s-apiserver-XXXXXXXXXX.us-east-1.elb.amazonaws.com:6443</code>)。 我們需要透過設定檔設定對應的<code>controlPaneEndpoint</code>與<code>podSubnet</code>(因為<code>--config</code>與<code>--pod-network-cidr</code>不能同時使用): <syntaxhighlight lang="yaml"> apiVersion: kubeadm.k8s.io/v1beta1 kind: ClusterConfiguration kubernetesVersion: stable apiServer: certSANs: - "internal-test-gslin-k8s-apiserver-XXXXXXXXXX.us-east-1.elb.amazonaws.com" controlPlaneEndpoint: "internal-test-gslin-k8s-apiserver-XXXXXXXXXX.us-east-1.elb.amazonaws.com:6443" networking: podSubnet: 192.168.0.0/16 </syntaxhighlight> 然後再透過設定檔初始化cluster的第一台主機: <syntaxhighlight lang="bash"> sudo kubeadm init --config=kubeadm-config.yaml </syntaxhighlight> 依照單master設定複製完設定檔: <syntaxhighlight lang="bash"> mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config </syntaxhighlight> 再來是設定CNI,在官方文件上是建議使用Weave: <syntaxhighlight lang="bash"> kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$(kubectl version | base64 | tr -d '\n')" </syntaxhighlight> 接下來是複製檔案到其他機器上,這邊是讓[[tmux]]或[[screen]]的使用者比較方便,可以直接剪下貼上: <syntaxhighlight lang="bash"> cd /etc/kubernetes/ sudo tar -zc -f - pki/{ca.*,sa.*,front-proxy-ca.*,etcd/ca.*} admin.conf | uuencode a.tar.gz </syntaxhighlight> 然後到目錄下產生<code>a.tar.gz</code>再解開: <syntaxhighlight lang="bash"> cd /etc/kubernetes/ sudo uudecode sudo tar zxvf a.tar.gz </syntaxhighlight> 加入時除了本來的指令外,需要加上<code>--experimental-control-plane</code>(只有這三台主機要加,其他的機器不用): <syntaxhighlight lang="bash"> sudo kubeadm join internal-test-gslin-k8s-apiserver-XXXXXXXXXX.us-east-1.elb.amazonaws.com:6443 --token xxxxxx.xxxxxxxxxxxxxxxx --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx --experimental-control-plane </syntaxhighlight> == 事後增加主機 == token預設是24小時有效,在過期後需要重新建立: <syntaxhighlight lang="bash"> sudo kubeadm token create </syntaxhighlight> 可以透過這個指令在建立token的同時,產生完整的加入指令: <syntaxhighlight lang="bash"> echo sudo kubeadm join $(kubeadm config view | grep ^controlPlaneEndpoint | awk '{print $2}') --token $(sudo kubeadm token create) --discovery-token-ca-cert-hash sha256:$(openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //') </syntaxhighlight> == 使用所有主機 == 一開始的主機(master)不會被分配到需求(因為安全設計),如果你希望讓master也可以加入,可以透過以下的指令讓master分配到需求: <syntaxhighlight lang="bash"> kubectl taint nodes --all node-role.kubernetes.io/master- </syntaxhighlight> == 標籤 == 可以針對主機進行標籤,供之後的<code>nodeSelector</code>使用: <syntaxhighlight lang="bash"> kubectl label nodes ip-172-31-1-1 instancetype=c5 kubectl label nodes ip-172-31-1-2 ip-172-31-1-3 ip-172-31-1-4 ip-172-31-1-5 ip-172-31-1-6 instancetype=r5 </syntaxhighlight> == 範例 == 簡單的版本,跑兩個Pod並且跑起sshd,並且把Host的Port 80拿來用(會是SSH): <syntaxhighlight lang="yaml"> apiVersion: apps/v1 kind: Deployment metadata: name: sshd spec: replicas: 2 selector: matchLabels: app: sshd template: metadata: labels: app: sshd spec: containers: - name: sshd image: ubuntu:18.04 command: ["/bin/sh", "-c"] args: - export DEBIAN_FRONTEND=noninteractive; sed -i 's/archive.ubuntu.com/us.archive.ubuntu.com/' /etc/apt/sources.list; apt update; apt install -y iproute2 iputils-ping locales mtr-tiny net-tools openssh-server telnet tzdata wget; mkdir /run/sshd; /usr/sbin/sshd; sleep 3153600000 ports: - containerPort: 22 hostPort: 80 </syntaxhighlight> 複雜一點的版本: <syntaxhighlight lang="yaml"> apiVersion: apps/v1 kind: StatefulSet metadata: name: example-r5 spec: replicas: 5 serviceName: example-r5 selector: matchLabels: app: example-r5 template: metadata: labels: app: example-r5 spec: containers: - name: example-r5 image: ubuntu:18.04 command: ["/bin/sh", "-c"] args: - export DEBIAN_FRONTEND=noninteractive; sed -i 's/archive.ubuntu.com/us.archive.ubuntu.com/' /etc/apt/sources.list; apt update; apt install -y iproute2 iputils-ping locales mtr-tiny net-tools tzdata wget; sleep 3153600000 resources: requests: memory: "15Gi" nodeSelector: instancetype: r5 --- apiVersion: apps/v1 kind: StatefulSet metadata: name: example-c5 spec: replicas: 1 serviceName: example-c5 selector: matchLabels: app: example-c5 template: metadata: labels: app: example-c5 spec: containers: - name: example-c5 image: ubuntu:18.04 command: ["/bin/sh", "-c"] args: - export DEBIAN_FRONTEND=noninteractive; sed -i 's/archive.ubuntu.com/us.archive.ubuntu.com/' /etc/apt/sources.list; apt update; apt install -y iproute2 iputils-ping locales mtr-tiny net-tools tzdata wget; sleep 3153600000 resources: requests: cpu: "7000m" nodeSelector: instancetype: c5 </syntaxhighlight> == 相關連結 == * [[Docker]] * [[minikube]] == 外部連結 == * {{Official|https://kubernetes.io/}} * [https://kubernetes.io/docs/setup/independent/create-cluster-kubeadm/ Creating a single master cluster with kubeadm] * [https://kubernetes.io/docs/setup/independent/high-availability/ Creating Highly Available Clusters with kubeadm] [[Category:軟體]]
此頁面使用了以下模板:
Template:Official
(
檢視原始碼
)
Template:Official website
(
檢視原始碼
)
Module:Arguments
(
檢視原始碼
)
Module:Official website
(
檢視原始碼
)
Module:URL
(
檢視原始碼
)
返回到「
Kubernetes
」。
導覽選單
個人工具
登入
命名空間
頁面
討論
臺灣正體
不转换
简体
繁體
大陆简体
香港繁體
澳門繁體
大马简体
新加坡简体
臺灣正體
視圖
閱讀
檢視原始碼
檢視歷史
更多
搜尋
導覽
首頁
近期變更
隨機頁面
MediaWiki說明
工具
連結至此的頁面
相關變更
特殊頁面
頁面資訊