Kubernetes教程之跟着官方文檔從零搭建K8Shtml
文章地址: blog.piaoruiqing.com/blog/2019/0…node
本文將帶領讀者一塊兒, 參照着Kubernetes官方文檔, 對其安裝部署進行講解. Kubernetes更新迭代很快, 書上、網上等教程可能並不能適用於新版本, 但官方文檔能.linux
閱讀這篇文章你能收穫到:git
閱讀本文你須要:github
文檔連接: Before you beginweb
序號 | 名稱 | 數量 | 備註 |
---|---|---|---|
1 | 服務器 | 2 | 操做系統: Linux(centos7, 其它操做系統也可, 安裝過程相似, 可參考官方文檔) 機器配置: CPU >= 2, 內存 >= 2G |
從官網找到kubeadm
安裝文檔入口, 文檔很詳細. 英文閱讀沒有障礙的讀者推薦直接查看英文文檔, 中文文檔不全且更新不及時安裝時可能存在問題.docker
筆者已經預先安裝好了兩臺虛擬機, centos7(CPUx2, 內存2.5G). 並在路由器上固定了這兩個虛擬機的IP地址.json
[root@k8s-master ~]$ vim /etc/hostname # 修改hostname
[root@k8s-master ~]$ vim /etc/hosts # 將本機IP指向hostname
[root@k8s-master ~]$ reboot -h # 重啓(能夠作徹底部前期準備後再重啓)
複製代碼
修改後, 兩臺虛擬機的配置以下:bootstrap
# in k8s-master
[root@k8s-master ~]$ cat /etc/hostname
k8s-master
[root@k8s-master ~]$ cat /etc/hosts | grep k8s
10.33.30.92 k8s-master
10.33.30.91 k8s-worker
# in k8s-worker
[root@k8s-worker ~]$ cat /etc/hostname
k8s-worker
[root@k8s-worker ~]$ cat /etc/hosts | grep k8s
10.33.30.92 k8s-master
10.33.30.91 k8s-worker
複製代碼
文檔連接: Verify the MAC address and product_uuid are unique for every nodevim
[root@k8s-master ~]$ ifconfig -a # 查看MAC
[root@k8s-master ~]$ cat /sys/class/dmi/id/product_uuid # 查看product_uuid
複製代碼
注: 若是你的centos7沒有ifconfig
命令, 能夠執行yum install net-tools
進行安裝.
文檔連接: Check required ports
因爲是本地內網測試環境, 筆者圖方便, 直接關閉了防火牆. 若安全要求較高, 能夠參考官方文檔放行必要端口.
[root@k8s-master ~]$ systemctl stop firewalld # 關閉服務
[root@k8s-master ~]$ systemctl disable firewalld # 禁用服務
複製代碼
修改/etc/selinux/config
, 設置SELINUX=disabled
. 重啓機器.
[root@k8s-master ~]$ sestatus # 查看SELinux狀態
SELinux status: disabled
複製代碼
文檔連接: Before you begin
Swap disabled. You MUST disable swap in order for the kubelet to work properly.
編輯/etc/fstab
, 將swap註釋掉. 重啓機器.
[root@k8s-master ~]$ vim /etc/fstab
#/dev/mapper/cl-swap swap swap defaults 0 0
複製代碼
Docker官方文檔對安裝步驟描述已經足夠詳細, 過程並不複雜, 本文便再也不贅述.
Docker請使用18.09
, k8s暫不支持Docker最新版19.x
, 安裝時請按照文檔描述的方式明確指定版本號yum install docker-ce-18.09.9-3.el7 docker-ce-cli-18.09.9-3.el7 containerd.io
.
若網絡很差, 可換用國內源, 阿里雲、中科大等均可. 此處附上阿里雲源docker安裝文檔地址: 容器鏡像服務.
安裝完畢後, 建議將docker源替換爲國內. 推薦阿里雲鏡像加速, 有阿里雲帳號便可無償使用.阿里雲 -> 容器鏡像服務 -> 鏡像中心 -> 鏡像加速
配置Docker
文檔地址: Container runtimes
修改/etc/docker/daemon.json
爲以下內容:
{
"registry-mirrors": ["https://xxxxxxxx.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"storage-driver": "overlay2"
}
複製代碼
https://xxxxxxxx.mirror.aliyuncs.com
爲阿里雲鏡像加速地址, xxxxxxxx
須要替換爲本身帳戶中的地址. 如圖:
安裝配置完畢後執行:
[root@k8s-master ~]$ systemctl enable docker
[root@k8s-master ~]$ systemctl start docker
複製代碼
因爲國內網絡緣由, 官方文檔中的地址不可用, 本文替換爲阿里雲鏡像地址, 執行如下代碼便可:
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
exclude=kube*
EOF
複製代碼
[root@k8s-master ~]$ yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes
[root@k8s-master ~]$ systemctl enable kubelet && systemctl start kubelet
複製代碼
cat <<EOF > /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system
複製代碼
注意: 至此, 以上的所有操做, 在Worker機器上也須要執行. 注意hostname等不要相同.
[root@k8s-master ~]$ kubeadm config print init-defaults > kubeadm-init.yaml
複製代碼
該文件有兩處須要修改:
advertiseAddress: 1.2.3.4
修改成本機地址imageRepository: k8s.gcr.io
修改成imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
修改完畢後文件以下:
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
- system:bootstrappers:kubeadm:default-node-token
token: abcdef.0123456789abcdef
ttl: 24h0m0s
usages:
- signing
- authentication
kind: InitConfiguration
localAPIEndpoint:
advertiseAddress: 10.33.30.92
bindPort: 6443
nodeRegistration:
criSocket: /var/run/dockershim.sock
name: k8s-master
taints:
- effect: NoSchedule
key: node-role.kubernetes.io/master
---
apiServer:
timeoutForControlPlane: 4m0s
apiVersion: kubeadm.k8s.io/v1beta2
certificatesDir: /etc/kubernetes/pki
clusterName: kubernetes
controllerManager: {}
dns:
type: CoreDNS
etcd:
local:
dataDir: /var/lib/etcd
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
kind: ClusterConfiguration
kubernetesVersion: v1.15.0
networking:
dnsDomain: cluster.local
serviceSubnet: 10.96.0.0/12
scheduler: {}
複製代碼
[root@k8s-master ~]$ kubeadm config images pull --config kubeadm-init.yaml
複製代碼
[root@k8s-master ~]$ kubeadm init --config kubeadm-init.yaml
複製代碼
等待執行完畢後, 會輸出以下內容:
...
Your Kubernetes control-plane has initialized successfully!
...
Then you can join any number of worker nodes by running the following on each as root:
kubeadm join 10.33.30.92:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:2883b1961db36593fb67ab5cd024f451b934fc0e72e2fa3858dda3ad3b225837
複製代碼
最後兩行須要保存下來, kubeadm join ...
是worker節點加入所須要執行的命令.
接下來配置環境, 讓當前用戶能夠執行kubectl命令:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
複製代碼
測試一下: 此處的NotReady
是由於網絡還沒配置.
[root@k8s-master kubernetes]$ kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master NotReady master 3m25s v1.15.3
複製代碼
文檔地址: Instructions
下載描述文件
[root@k8s-master ~]$ wget https://docs.projectcalico.org/v3.8/manifests/calico.yaml
[root@k8s-master ~]$ cat kubeadm-init.yaml | grep serviceSubnet:
serviceSubnet: 10.96.0.0/12
複製代碼
打開calico.yaml
, 將192.168.0.0/16
修改成10.96.0.0/12
須要注意的是, calico.yaml中的IP和kubeadm-init.yaml須要保持一致, 要麼初始化前修改kubeadm-init.yaml, 要麼初始化後修改calico.yaml.
執行kubectl apply -f calico.yaml
初始化網絡.
此時查看node信息, master的狀態已是Ready
了.
[root@k8s-master ~]$ kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 15m v1.15.3
複製代碼
文檔地址: Web UI (Dashboard)
[root@k8s-master ~]$ wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta4/aio/deploy/recommended.yaml
[root@k8s-master ~]$ kubectl apply -f recommended.yaml
複製代碼
部署完畢後, 執行kubectl get pods --all-namespaces
查看pods狀態
[root@k8s-master kubernetes]$ kubectl get pods --all-namespaces | grep dashboard
NAMESPACE NAME READY STATUS
kubernetes-dashboard dashboard-metrics-scraper-fb986f88d-m9d8z 1/1 Running
kubernetes-dashboard kubernetes-dashboard-6bb65fcc49-7s85s 1/1 Running
複製代碼
文檔地址: Creating sample user
建立一個用於登陸Dashboard的用戶. 建立文件dashboard-adminuser.yaml
內容以下:
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin-user
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin-user
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin-user
namespace: kube-system
複製代碼
執行命令kubectl apply -f dashboard-adminuser.yaml
.
官方文檔中提供了登陸1.7.X以上版本的登陸方式, 但並不清晰, 筆者沒有徹底按照該文檔的方式進行操做.
[root@k8s-master ~]$ grep 'client-certificate-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.crt
[root@k8s-master ~]$ grep 'client-key-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.key
[root@k8s-master ~]$ openssl pkcs12 -export -clcerts -inkey kubecfg.key -in kubecfg.crt -out kubecfg.p12 -name "kubernetes-client"
複製代碼
第三條命令生成證書時會提示輸入密碼, 能夠直接兩次回車跳過.
kubecfg.p12
即須要導入客戶端機器的證書. 將證書拷貝到客戶端機器上, 導入便可.
~$ scp root@10.33.30.92:/root/.kube/kubecfg.p12 ./
複製代碼
此時咱們能夠登陸面板了, 訪問地址: https://{k8s-master-ip}:6443/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/login
, 登陸時會提示選擇證書, 確認後會提示輸入當前用戶名密碼(注意是電腦的用戶名密碼).
文檔地址:Bearer Token
執行kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
, 獲取Token.
[root@k8s-master .kube]$ kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')
Name: admin-user-token-dhhkb
Namespace: kube-system
Labels: <none>
Annotations: kubernetes.io/service-account.name: admin-user
kubernetes.io/service-account.uid: b20d1143-ce94-4379-9e14-8f80f06d8479
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1025 bytes
namespace: 11 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJhZG1pbi11c2VyLXRva2VuLWRoaGtiIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQubmFtZSI6ImFkbWluLXVzZXIiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC51aWQiOiJiMjBkMTE0My1jZTk0LTQzNzktOWUxNC04ZjgwZjA2ZDg0NzkiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6a3ViZS1zeXN0ZW06YWRtaW4tdXNlciJ9.f6IbPGwIdFZWStzBj8_vmF01oWW5ccaCpPuVQNLSK1pgEqn0kNVK_x0RYSuKEnujObzpQQdFiRYcI6ITHja2PIVc5Nv83VCn5IaLvZdYuGZWUYRw0efJUBMA4J4N8-pRkiw6fYAuWLeGYghLNXL_nDdC_JkG75ASqrr3U1MVaikOcfrEPaI-T_AJ3TMYhI8aFoKiERpumu5W1K6Jl80Am9pWDX0Ywis5SSUP1VYfu-coI48EXSptcaxEyv58PrHUd6t_oMVV9rpqSxrNtMZvMeXqe8Hnl21vR7ls5yTZegYtHXSc3PKvCaIalKhYXAuhogNcIXHaMzvLSbf-DSQkVw
複製代碼
複製該Token到登陸頁, 點擊登陸便可, 效果以下:
重複執行 前期準備-修改hostname
~ 安裝Kubernetes-修改網絡配置
的所有操做, 初始化一個Worker機器.
執行以下命令將Worker加入集羣:
kubeadm join 10.33.30.92:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:2883b1961db36593fb67ab5cd024f451b934fc0e72e2fa3858dda3ad3b225837
複製代碼
添加完畢後, 在Master上查看節點狀態:
[root@k8s-master ~]$ kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master Ready master 10h v1.15.3
k8s-worker Ready <none> 96s v1.15.3
複製代碼
在面板上也可查看:
若是這篇文章對您有幫助,請點個贊吧 ( ̄▽ ̄)"
歡迎關注公衆號(代碼如詩):