将Kubernetes安装到多节点环境中

本次構建的環境如下所示:
・裸金屬服務器
・虛擬機監控器:EXSi
・操作系統:CentOS 7
・Kubernetes版本:v1.10.2
・節點配置:1台主節點 + 2台工作節點

执行内容包括:
– 安装Kubernetes
– 安装仪表盘
– 部署测试用Pod
– 配置外部访问。

安装 Kubernetes

我参考了如何在CentOS 7 / RHEL 7上安装Kubernetes(k8s)1.7的方法,但是直接使用并不能成功。

構建主节点系统

hostnamectl set-hostname 'k8s-master'
exec bash
setenforce 0
systemctl stop firewalld
systemctl disable firewalld

由于我想尽早体验Kubernetes,所以将防火墙关闭了。

在这个链接中,我们正在编辑“/etc/hosts”,但我们会跳过这一步。原因稍后会说明。

vi /etc/fstab

注释或删除第三行(以”swap swap”标记的行)。

为了使设置生效,需要在这里重新启动。

在默认情况下,CentOS 7无法使用Kubernetes包,因此需要进行存储库配置。

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

完成設定后,执行kubeadm和Docker的安装与启用。

yum install kubeadm docker -y
systemctl restart docker && systemctl enable docker
systemctl  restart kubelet && systemctl enable kubelet

进行Kubernetes的初始化和设置。

kubeadm init
image.png

执行嵌入在输出内的指令。

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

确认已经进行了稳固的构架。

kubectl get nodes

結果輸出完成後就可以了!

The connection to the server localhost:8080 was refused - did you specify the right host or port?    

一旦输出了上述的config,就忘记了复制。

确认已部署的Pod。

kubectl get pods --all-namespaces   

似乎没有部署任何kube-dns。
需要部署Pod网络以使不同主机的容器能够互相通信。

export kubever=$(kubectl version | base64 | tr -d '\n') 
kubectl apply -f "https://cloud.weave.works/k8s/net?k8s-version=$kubever"              

我要检查一下已部署的Pod

kubectl get pods --all-namespaces   

DNS已经创建完成了!使用这个,master节点已经建立好了。

工作节点的构建和主节点的初始设置相同。

hostnamectl set-hostname 'k8s-master'
exec bash
setenforce 0
systemctl stop firewalld
systemctl disable firewalld
vi /etc/fstab
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
yum install kubeadm docker -y
systemctl restart docker && systemctl enable docker
systemctl  restart kubelet && systemctl enable kubelet
mkdir -p $HOME/.kube
vi $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config

在主节点上创建的config文件被放置在「$HOME/.kube/config」中。

然后,进行节点加入。
参与加入的命令是在主节点上执行”kubeadm init”命令后输出的以下命令。

kubeadm join 192.168.11.114:6443 --token puhvv1.lgfvwgzljq63sndl --discovery-token-ca-cert-hash 
 sha256:ae212816cc3bdf83c3df92dd4dfc73b4ed5421376b273ce41fb6a030680fa0fe

令牌有一个有效期限,可以使用以下命令重新发布。
如果从主节点构建开始过了一段时间,是否需要重新发布并添加节点?

kubeadm token create  

请确认Node是否可以参加。

kubectl获取nodes

如果输出如下,则表示OK。

NAME           STATUS    ROLES     AGE       VERSION                                                                 
k8s-master     Ready     master    1d        v1.10.2                                                                 
worker-node1   Ready     <none>    2m        v1.10.2                                                                 
worker-node2   Ready     <none>    11s       v1.10.2   

仪表盘安装

Kubernetes Dashboard安装按照官方网站的步骤成功执行了。

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml 

由于外部服务器/客户端无法访问,需要使得仪表板可以访问。

kubectl proxy --address 0.0.0.0 --accept-hosts '.*'

通过以下URL,可以从外部访问:
“http://{主节点的IP}:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/”

然后,在访问仪表盘方面,我们参考了以下网站,并使其可以在无需认证的情况下进行操作。
以管理员权限登录仪表盘。

请创建一个类似以下的yaml文件:

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: kubernetes-dashboard
  labels:
    k8s-app: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: kubernetes-dashboard
  namespace: kube-system

使用kubectl进行执行。

kubectl create -f dashboard-admin.yml

通过这个设置,即使按下”跳过”按钮进行无认证进入,也可以执行所有操作。

另外,之前没有在”/etc/hosts”中添加设置的原因是因为仪表板没有正常运作。尽管部署是成功的,但无法正常访问。当删除并重新构建了”/etc/hosts”后,一切顺利,很可能是原因所在。

测试Pod部署

这次我们部署了一个nginx容器,并允许外部访问。
根据以下内容创建”deployment-example.yaml”文件。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: deployment-example
spec:
  replicas: 2
  # Podのテンプレート(PodTemplate)
  template:
    metadata:
      labels:
        app: deployment-example
    spec:
      containers:
      - name: nginx
        image: nginx:1.10
        ports:
        - containerPort: 80
kubectl create -f deployment-example.yaml --record

查看已创建的 Pod。

kubectl get pods -o wide

输出将如下,并且可以从服务器内进行访问。

NAME                                  READY     STATUS    RESTARTS   AGE       IP          NODE
deployment-example-564f5cdb48-s475f   1/1       Running   0          15m       10.32.0.2   worker-node1
deployment-example-564f5cdb48-xf89b   1/1       Running   0          15m       10.40.0.0   worker-node2
curl -I http://10.32.0.2

然而,只有这样还无法从外部进行访问。

外部访问设置 bù

部署一个用于外部访问的服务。

kubectl expose deployment deployment-example --type=LoadBalancer --name=my-service
kubectl get services
NAME         TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP      10.96.0.1     <none>        443/TCP        1d
my-service   LoadBalancer   10.105.35.2   <pending>     80:30590/TCP   6s

根据我了解,GKE等情况下似乎可以通过这个来实现外部访问。
但是在本环境中,“EXTERNAL-IP”是空的,没有创建外部访问所需的IP,因此无法访问。
更详细的信息请参考手动创建 Kubernetes 的 Service 类型 LoadBalancer那一篇。

因此,请按照上述链接的指示进行设置,以便从外部进行访问。

cat << EOF > haproxy.cfg
global
    maxconn 256

defaults
    mode http
    timeout client     120000ms
    timeout server     120000ms
    timeout connect      6000ms

listen http-in
    bind *:80
    server k8s-master 192.168.11.114:30590
    server worker-node1 192.168.11.115:30590
    server worker-node2 192.168.11.116:30590
EOF

请将主机名、IP地址和端口号根据您的环境进行修改。
端口号可以通过 “kubectl get services” 命令确认。

然后,启动HAProxy。

docker run -d --name haproxy -p 80:80 -v $(pwd)/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro haproxy:1.8

通过这样做,可以让外部服务器/客户端能够访问到nginx。
URL:http://localhost/