kubeadm安裝k8s測試環境

NO IMAGE

目標是搭建一個可測試的k8s環境,使用的工具 kubeadm, 最終一個master節點(非高可用),2個node節點。

環境以及版本

  • Centos7.3
  • kubeadm 1.11.1
  • kubelet 1.11.1
  • kubectl 1.11.1
  • docker-ce-18.06

說明 kubeadm預設的etcd是本地的,所以這裡使用的是本地 etcd,而不是kubeadm中的

nameiprole
master110.0.12.13master
node110.0.12.10node
node210.0.12.8node

基礎環境

三臺主機都需要安裝的有docker, kubeadm, kubelet 都是採用 yum 來安裝,需要關閉swap,以及防火牆,禁用SELinux。

禁用 SELinux

sudo setenforce 0

關閉swap

sudo swapoff -a
vim /etc/fstab  #swap一行註釋掉

安裝 docker

sudo yum install -y docker

設定開機啟動和啟動服務

sudo systemctl enable docker
sudo systemctl start docker

看下docker的版本, 至少高於 1.12 版本

sudo docker version

安裝 Kubernetes 包

配置 yum 源,並安裝 kubeadm, kubectl, and kubelet

新增 k8s 源

sudo bash -c 'cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF'

如果無法訪問google,那麼採用國內源

sudo 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=0
repo_gpgcheck=0
gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF

安裝 k8s 需要的元件

sudo yum install -y kubelet kubeadm kubectl
sudo systemctl enable kubelet 

kubeadm v1.11 之前需要先啟動 sudo systemctl start kubelet 服務,但是我在安裝v1.11 發現並不需要先啟動 kubelet服務,後面的 kubeadm init 彙總會自動啟動

k8s 網路需要使用 網路轉發,所以需要設定

sudo bash -c 'cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF'

應用設定

sudo sysctl --system

關閉防火牆

只是為了方面,不是可選,測試環境方面

sudo systemctl disable firewalld
sudo systemctl stop firewalld
sudo systemctl status firewalld

Master 操作

由於採用外部 etcd,所以要在 master 節點安裝 etcd服務,這裡也是etcd是單節點

安裝etcd

不管是etcd 叢集還是單機,或者是 http, https都可以,只要在 kubeadm 中配置好就行。 這部分先略過,大家可以找下 etcd的安裝手冊。

實驗中是單機 etcd,然後監聽地址為 https://10.0.12.13:2379

kubeadm

kubeadm配置 kubeadm.yaml (新建,任意目錄下)

---
apiVersion: kubeadm.k8s.io/v1alpha1
kind: MasterConfiguration
kubernetesVersion: v1.11.1
apiServerCertSANs:
- 10.0.12.13
networking:
serviceSubnet: 10.96.0.0/12
podSubnet: 10.244.0.0/16
api:
advertiseAddress: 10.0.12.13
etcd:
endpoints:
- https://10.0.12.13:2379
caFile: /etc/etcd/ssl/etcd-ca.pem
certFile: /etc/etcd/ssl/etcd.pem
keyFile: /etc/etcd/ssl/etcd-key.pem

kubeadm的參考文件地址 可以根據需要自己更改

kubeadm 安裝 k8s

下面是 kubeadm 表演的時間了

sudo kubeadm init --config kubeadm.yaml
# 所有階段會列印出來
....
Your Kubernetes master has initialized successfully!
To start using your cluster, you need to run the following as a regular user:
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
You should now deploy a pod network to the cluster.
Run "kubectl apply -f [podnetwork].yaml" with one of the options listed at:
https://kubernetes.io/docs/concepts/cluster-administration/addons/
You can now join any number of machines by running the following on each node
as root:
kubeadm join 10.0.12.13:6443 --token 4b3m3i.hrzetk4qb5uh74e4 --discovery-token-ca-cert-hash sha256:357b0fec02af903e66022019cea82ff3a95264479cb5d222ea8e938df2db3d20

給出一些下面要做的步驟,配置 kubectl, 配置網路元件,以及 worker node 加入的命令。

下面就是跟著提示配置 kubectl

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

檢視狀態

$ kubectl get nodes
NAME      STATUS     ROLES     AGE       VERSION
master1   NotReady   master    5m        v1.11.1

可以看到 status 為 NotReady, 因為網路元件還沒有配置, 下面配置 flannel。

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/k8s-manifests/kube-flannel-rbac.yml

再來看狀態

$ kubectl get pods --all-namespaces
NAMESPACE     NAME                              READY     STATUS    RESTARTS   AGE
kube-system   coredns-78fcdf6894-4744c          1/1       Running   0          5m
kube-system   coredns-78fcdf6894-jbvhd          1/1       Running   0          5m
kube-system   kube-apiserver-master1            1/1       Running   0          5m
kube-system   kube-controller-manager-master1   1/1       Running   0          5m
kube-system   kube-flannel-ds-amd64-kp7cr       1/1       Running   0          11s
kube-system   kube-proxy-6778v                  1/1       Running   0          5m
kube-system   kube-scheduler-master1            1/1       Running   0          5m
$ kubectl get nodes
NAME      STATUS    ROLES     AGE       VERSION
master1   Ready     master    6m        v1.11.1
]$ kubectl get cs
NAME                 STATUS    MESSAGE              ERROR
scheduler            Healthy   ok
controller-manager   Healthy   ok
etcd-0               Healthy   {"health": "true"}

master 節點的配置基本完成了。

Node 配置

就是執行之前 init 最後打出的那個命令

sudo  kubeadm join 10.0.12.13:6443 --token 4b3m3i.hrzetk4qb5uh74e4 --discovery-token-ca-cert-hash sha256:357b0fec02af903e66022019cea82ff3a95264479cb5d222ea8e938df2db3d20

2個node操作完之後,再來 master 節點看看

$ kubectl get nodes
NAME      STATUS    ROLES     AGE       VERSION
master1   Ready     master    7m        v1.11.1
node1     Ready     <none>    18s       v1.11.1
node2     Ready     <none>    10s       v1.11.1

用一個簡單pod測試下

kubectl run -i --tty busybox --image=busybox --restart=Never -- sh
# 正常執行,再看看排程情況
$ kubectl get pod --show-all -o wide
NAME      READY     STATUS      RESTARTS   AGE       IP           NODE
busybox   0/1       Completed   0          48s       10.244.1.2   node1

其他

檢視 kubeadm 的配置

sudo kubeadm config view