将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
执行嵌入在输出内的指令。
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/