環境準備
主機說明
主機名 | IP地址 | 角色 |
---|---|---|
master | 192.168.50.184 | k8s_master |
node | 192.168.50.56 | k8s_node |
所有節點均需做以下操作
關閉防火牆與selinux
- 關閉防火牆
systemctl stop firewalld
systemctl disable firewalld
- 關閉selinux
setenforce 0
sed -i.ori "s#SELINUX=enforcing#SELINUX=disabled#g" /etc/selinux/config
關閉swap分區
swapoff -a && sysctl -w vm.swappiness=0
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak |grep -v swap > /etc/fstab
爲什麼要關閉swap分區?
當前的Qos策略都是假定主機不啓用內存Swap。如果主機啓用了Swap,那麼Qos策略可能會失效。例如:兩個Pod都剛好達到了內存Limits,由於內存Swap機制,它們還可以繼續申請使用更多的內存。如果Swap空間不足,那麼最終這兩個Pod中的進程可能會被“殺掉”。
目前Kubernetes和Docker尚不支持內存Swap空間的隔離機制。它的想法是將實例緊密包裝到儘可能接近100%。 所有的部署應該與CPU /內存限制固定在一起。 所以如果調度程序發送一個pod到一臺機器,它不應該使用交換。 另一方面是出於對性能的考慮。
設置內核參數
cat > /etc/sysctl.d/99-sysctl.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
vm.swappiness=0
vm.overcommit_memory=1
vm.panic_on_oom=0
fs.inotify.max_user_watches=89100
EOF
- 使內核參數配置生效
sysctl -p /etc/sysctl.d/99-sysctl.conf
mount -t cgroup -o cpu,cpuacct none /sys/fs/cgroup/cpu,cpuacct
- 加載內核模塊
modprobe br_netfilter
modprobe ip_vs
安裝並啓動docker
卸載舊版本docker
yum remove -y docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
設置 yum repository
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安裝docker
yum install -y docker-ce-18.09.7 docker-ce-cli-18.09.7 containerd.io
修改docker鏡像源爲國內鏡像源
vi /lib/systemd/system/docker.service
啓動docker
systemctl enable docker
systemctl start docker
安裝nfs-utils
yum install -y nfs-utils
安裝kubernetes
配置kubernetes的yum源
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
卸載舊版本kubernetes
yum remove -y kubelet kubeadm kubectl
安裝
yum install -y kubelet-1.15.3 kubeadm-1.15.3 kubectl-1.15.3
修改docker Cgroup Driver爲systemd
將/usr/lib/systemd/system/docker.service文件中的這一行 ExecStart=/use/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
修改爲 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --exec-opt native.cgroupdriver=systemd
vi /var/systemd/system/docker.service
重啓docker
systemctl daemon-reload
systemctl restart docker
啓動kubelet
systemctl enable kubelet && systemctl start kubelet
docker version
-------------------------以上操作需要在所有節點執行,切記--------------------------------
初始化 worker節點
只在master節點操作
export MASTER_IP=x.x.x.x
替換x.x.x.x爲master節點的實際IP(內網IP)
export APISERVER_NAME=apiserver.demo
替換apiserver.demo爲你想要的的dnsname,建議不要使用master的hostname作爲dnsname
export POD_SUBNET=10.100.0.1/20
Kubernetes 容器組所在的網段,該網段安裝完成後,由 kubernetes 創建,事先並不存在於物理網絡中
echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts
cat <<EOF > ./kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.15.3
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers
controlPlaneEndpoint: "${APISERVER_NAME}:6443"
networking:
serviceSubnet: "10.96.0.0/12"
podSubnet: "${POD_SUBNET}"
dnsDomain: "cluster.local"
EOF
kubeadm init
kubeadm init --config=kubeadm-config.yaml --upload-certs
配置 kubectl
mkdir /root/.kube/
cp -i /etc/kubernetes/admin.conf /root/.kube/config
安裝kubectl
mkdir /root/.kube/
cp -i /etc/kubernetes/admin.conf /root/.kube/config
安裝 calico 網絡插件
wget https://docs.projectcalico.org/v3.8/manifests/calico.yaml
sed -i "s#192\.168\.0\.0/16#${POD_SUBNET}#" calico.yaml
kubectl apply -f calico.yaml
檢查master初始化結果
執行如下命令,等待 3-10 分鐘,直到所有的容器組處於 Running 狀態
watch kubectl get pod -n kube-system -o wide
查看 master 節點初始化結果
kubectl get nodes
初始化 worker節點
獲得 join命令參數
- 在master節點上執行
kubeadm token create --print-join-command
可獲取kubeadm join 命令及參數,如下所示
kubeadm join apiserver.demo:6443 --token mpfjma.2dvfg8flqihor4vt --discovery-token-ca-cert-hash sha256:6f7a8e40a815684372de5jje6f4d19aa2dbdb38411845a1cg7dd63485c43d303
初始化worker
在所有節點執行
echo "${MASTER_IP} ${APISERVER_NAME}" >> /etc/hosts
將MASTER_IP和APISERVER_NAME替換爲master的IP和之前設置的APISERVER_NAME
執行kubeadm join
kubeadm join apiserver.demo:6443 --token mpfjma.2dvfg8flqihor4vt --discovery-token-ca-cert-hash sha256:6f7a8e40a815684372de5jje6f4d19aa2dbdb38411845a1cg7dd63485c43d303
替換爲 master 節點上 kubeadm token create 命令的輸出
檢查初始化結果
- 在master上執行
kubectl get nodes
- 輸出結果如下所示
[root@demo-master-a-1 ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
demo-master-a-1 Ready master 5m3s v1.15.3
demo-worker-a-1 Ready <none> 2m26s v1.15.3
移除work節點
只在準備移除的work節點執行
kubeadm reset
- 在master節點上執行
kubectl delete node demo-worker-x-x
將x-x替換爲要移除節點的名字,可以通過kubectl get nodes查看
安裝 Ingress Controller
- 只在master節點上執行
kubectl apply -f https://kuboard.cn/install-script/v1.15.3/nginx-ingress.yaml
- 卸載Ingress Controller
kubectl delete -f https://kuboard.cn/install-script/v1.15.3/nginx-ingress.yaml
- 配置域名解析
將a.demo.yourdomain.com解析到任意work節點,訪問a.demo.yourdomain.com將得到一個404頁面
安裝kuboard
kubectl apply -f https://kuboard.cn/install-script/kuboard.yaml
- 獲取token
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep kuboard-user | awk '{print $1}')
獲取的token
Name: kuboard-user-token-rxgcl
Namespace: kube-system
Labels: <none>
Annotations: kubernetes.io/service-account.name: kuboard-user
kubernetes.io/service-account.uid: 8d19a6a2-78e7-4948-9af6-5b7b1d233c28
Type: kubernetes.io/service-account-token
Data
====
ca.crt: 1025 bytes
namespace: 11 bytes
token: eyJhbGciOiJSUzI1NiIsImtpZCI6IiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJrdWJvYXJkLXVzZXItdG9rZW4tcnhnY2wiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoia3Vib2FyZC11c2VyIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiOGQxOWE2YTItNzhlNy00OTQ4LTlhZjYtNWI3YjFkMjMzYzI4Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmt1Ym9hcmQtdXNlciJ9.Lu0KggmFJD99nsO_hi7BD5RNr-nIIjfpYoyEytgmX6quygZ9f8iYYXrAwUFycqb1CCxJcG_j-Xa3qh9YPder1B_xBgangq_s6NiF4m3tVNoEWfrtK8keXvgORzh17FRaDClGueiUmbg6ufaoD3pIc5pmWCBrvK0KWyBCSlwoMlJYsCUk25DIzjkcqbUCiXevGEOJmK7Fc1g77rmf9w4Lhov4NcyQu9NlQZwlIL4M8iAKKVVwdedqkzStU41y2BUc_HfNGKRchqrc5U9jvZ4lJvrMp6GK7oUjaxDWgb8D-ESZdXEyrKwW1HdoQxVfAaCzOaOcoA9HVxh1pASaEzS2Cw
- 訪問kuboard
http://任意worker節點ip+32567/