环境准备

Kubernetes 是用于自动部署,扩展和管理容器化应用程序的开源系统。

准备好三台机器:

1
2
3
192.168.1.101 k8s.master
192.168.1.102 k8s.node.1
192.168.1.103 k8s.node.2

关闭防火墙

1
2
systemctl stop firewalld
systemctl stop iptables

关闭 SELinux

1
setenforce 0

禁用交换Swap

1
2
3
vim /etc/fstab 

# /dev/mapper/cl-swap swap swap defaults 0 0

在重启。

START

添加源

这里,添加 virt7-testing 的源:

1
2
3
4
5
6
vim /etc/yum.repo.d/k8.repo

[virt7-testing]
name=virt7-testing
baseurl=https://cbs.centos.org/repos/virt7-kubernetes-110-testing/x86_64/os/
gpgcheck=0

开始安装 Kubernets

这里,我们在三台机器上都要进行安装,这里的安装使用的是 yum 的安装方式:

1
yum -y install --enablerepo=virt7-testing kubernetes

很荣幸的告诉你上面的方法无效,因为地址错了,那我们现在来尝试一下官网提供的方式来进行安装。

官网提供的方式

检查你的系统是否支持虚拟化

一般出现的都不会是非空的内容。

1
grep -E ‘vmx|svm' /proc/cpuinfo

如果您这边出现的是空的内容,说明您的虚拟化并没有开启。现在您需要确认您是在虚拟机操作还是在实体机操作。如果是在虚拟机操作,请在虚拟机中打开虚拟化,如果部署虚拟集操作,建议手动安装 KVM | SVM 。这两个是根据您的 CPU 来的. 笔者的是 Intel 的处理器,所以安装的是 KVM 。

1
yum -y install qemu-kvm libvirt virt-install bridge-utils

验证一下:

1
lsmod | grep kvm

正常是出现这个:

1
2
3
kvm_intel             188644  0 
kvm 621480 1 kvm_intel
irqbypass 13503 1 kvm

开始安装

现在,我们开始安装了。

1
2
3
4
5
6
7
8
9
10
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
1
2
3
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

systemctl enable kubelet && systemctl start kubelet
1
2
3
4
5
cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sysctl --system

初始化 Master

1
kubeadm config print init-defaults > kubeadm-init.yaml

这里需要修改的有:

  • advertiseAddress 换成自己的本机地址
  • imageRepository 改为:registry.cn-hangzhou.aliyuncs.com/google_containers
    开始拉取镜像
    1
    kubeadm config images pull --config kubeadm-init.yaml
    开始初始化:
    1
    kubeadm init --config kubeadm-init.yaml
    最后看到这个: 记录下来

master

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Your Kubernetes control-plane 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/

Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.1.101:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:9b73ea329c71b1d9baa96a955ed9a422cbd45dd4fe3ce0f3efd135c5065316ec

其中 kubeadm join 是 worker 节点加入所需要执行的命令。

现在来配置 kubectl 命令:

1
2
3
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
1
kubectl get node

这里出现的 NotReady 是因为网络还没配置。

配置网络

1
wget https://docs.projectcalico.org/v3.8/manifests/calico.yaml

这里,我们需要知道 kubeadm-init.yaml 中的 serviceSubnet 的值,并将 calico.yaml 中的 将192.168.0.0/16修改为 serviceSubnet 的值。

1
2
- name: CALICO_IPV4POOL_CIDR
value: "10.96.0.0/12"

此时我们需要执行一下:

1
kubectl apply -f calico.yaml
1
2
3
kubectl get pod --all-namespaces
# 这个要等一会才有变化
kubectl get node

安装 Dashboard

1
2
wget https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta4/aio/deploy/recommended.yaml
kubectl apply -f recommended.yaml

我们现在再来看一下这个 Pods 的状态:

1
kubectl get pods --all-namespaces

创建一个用户

dashboard-admin.yml 文件内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
apiVersion: v1
kind: ServiceAccount
metadata:
name: admin
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: admin
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: cluster-admin
subjects:
- kind: ServiceAccount
name: admin
namespace: kube-system
1
kubectl apply -f dashboard-admin.yml

证书生成

1
2
3
grep 'client-certificate-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.crt
grep 'client-key-data' ~/.kube/config | head -n 1 | awk '{print $2}' | base64 -d >> kubecfg.key
openssl pkcs12 -export -clcerts -inkey kubecfg.key -in kubecfg.crt -out kubecfg.p12 -name "kubernetes-client"

会生成三个文件:

1
2
3
-rw-r--r--  1 root root  1082 Apr 13 06:28 kubecfg.crt
-rw-r--r-- 1 root root 1675 Apr 13 06:28 kubecfg.key
-rw-r--r-- 1 root root 2464 Apr 13 06:29 kubecfg.p12

kubecfg.p12 即需要导入客户端机器的证书. 将证书拷贝到客户端机器上, 导入即可.

登陆 Dashboard

1
wget  https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc7/aio/deploy/recommended.yaml

修改如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
kind: Service
apiVersion: v1
metadata:
labels:
k8s-app: kubernetes-dashboard
name: kubernetes-dashboard
namespace: kubernetes-dashboard
spec:
type: NodePort
ports:
- port: 443
targetPort: 8443
nodePort: 30000
selector:
k8s-app: kubernetes-dashboard

然后我们在创建:

1
kubectl create -f recommended.yaml

在查看一下:

1
kubectl get svc -n kubernetes-dashboard

现在可以登录了: https://192.168.1.101:30000/#/login

我们使用 Token 的方式进行登录:

1
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user | awk '{print $1}')

我们拿一个 Token:
Token名: dashboard-admin-token-nl5jk

1
eyJhbGciOiJSUzI1NiIsImtpZCI6IkdHTm1jdTFyTnVwYXljei03d0kyUE5KN3Q3aTE5aFVPRUVvWWhtaFVsdzAifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJkYXNoYm9hcmQtYWRtaW4tdG9rZW4tbmw1amsiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlcnZpY2UtYWNjb3VudC5uYW1lIjoiZGFzaGJvYXJkLWFkbWluIiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiNWZkNDQyMmMtZGU0Yy00Y2Y3LTg5MTctNjlmNmJiZmJmN2U4Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Omt1YmUtc3lzdGVtOmRhc2hib2FyZC1hZG1pbiJ9.M_C70yPvh6vZk-JgWWOHxTLIgefkG3zkPEYrhtbD51UtjPBHjr5lTCo0OvCXI_R3xasH4TuPTkoM9Fl2x4FJASTYhZtMjqaPEsoitHdFkTvVGGEs-fnewMr8a44-OhB4743jIzj6UTtd1wonezhguvcatsImWkdgU3rPjuB-5-Ai_JUmBNyuKwaIOeu0ilHrbDSBgWcQQKRxrcZ7_E7leZH8f3sdDOP2FWSWddti5Hy916fz5pAGZ-fJk9q4gdlrSLHzY-aXhNThZ6c1VTPX-5G4oy-u9fbTKWR1JsU2bVopBunqFxNdCLuFwaicobu_KyxGvzapWYnH86NnyYZlLg

这样 我们的 Mater 就好了。

重复执行 前期准备-修改hostname ~ 安装Kubernetes-修改网络配置的全部操作, 初始化一个Worker机器. 这里我们转下一篇:Kubernets集群环境部署过程:众里寻他千百度