kubernetes部署-多虚拟机部署

1
2
author: yewei_andy
email: 896882701yw@gmail.com

部署k8s分布式

主机配置:

虚拟机方案:
  1. 使用虚拟机部署3个一样的centos7或者ubuntu虚拟机
  2. 配置2张网卡
    • 一张用来主机和虚拟机通讯(host only 网卡),master和node节点通信也是使用这张网卡
    • 一张用来nat和外网通信
三台物理机方案:
  1. 三台内网的主机即可,centos7或者ubuntu

配置docker的代理(主要用来拉取镜像使用)

1
2
3
4
5
6
7
8
9
10
11
mkdir -p /etc/systemd/system/docker.service.d

cat <<EOF >/etc/systemd/system/docker.service.d/http-proxy.conf
[Service]
Environment="HTTP_PROXY=http://192.168.56.1:1087/"
Environment="HTTPS_PROXY=http://192.168.56.1:1087/"
Environment="NO_PROXY=localhost,127.0.0.1,localaddress,.localdomain.com"
EOF

systemctl daemon-reload
systemctl restart docker
  • 测试配置

    1
    2
    docker info | grep Proxy  # 有输出说明配置成功
    docker pull gcr.io/google-containers/hello-world # pull 成功代表代理器工作正常。

配置终端代理(如果有需要)

全局终端http/https代理:
1
2
3
4
5
6
cat <<EOF >>/etc/environment
http_proxy="http://{http代理地址}:8118/"
https_proxy="http://{http代理地址}:8118/"
no_proxy="localhost, 127.0.0.1"
EOF
source /etc/environment
仅限当前shell生效的代理(使用export):
1
2
3
export http_proxy="http://{http代理地址}:8118/"
export https_proxy="http://{http代理地址}:8118/"
export no_proxy="localhost, 127.0.0.1"

修改host.conf文件

修改这个文件的目的在于使用主机名都能访问,不需要输入ip地址

  • 三台机都要设置
1
2
3
4
5
#192.168.56.101 yeweinode1
# /etc/hosts
{节点1的ip} 节点1的主机名
{节点2的ip} 节点1的主机名
{节点3的ip} 节点1的主机名

关闭防火墙

由于k8s会大量修改防火墙的配置,因此在使用k8s的时候尽量关闭iptables或者防火墙

1
2
3
4
systemctl stop firewalld
systemctl disable firewalld
systemctl stop ufw
systemctl disable ufw

关闭selinux

1
2
3
4
5
6
# 临时禁用
setenforce 0

# 永久禁用
vim /etc/selinux/config # 或者修改/etc/sysconfig/selinux
SELINUX=disabled

关闭swap

1
2
3
4
5
# 临时关闭
swapoff -a

# 注释掉以下字段
/dev/mapper/cl-swap swap swap defaults 0 0
如果不想关闭swap的话,需要做以下操作:
  1. kubeadm 启动时候需要加入参数

    1
    --ignore-preflight-errors=swap
  2. 修改/etc/systemd/system/kubelet.service.d/10-kubeadm.conf

  3. 在这个文件加入以下代码:

    1
    Environment="KUBELET_EXTRA_ARGS=--fail-swap-on=false"

    使得最后看起来像这样:

命令行程序安装(安装kubectl kubeadm kubelet三个组件):

使用centos:
  • 配置软件源
1
2
3
4
5
6
7
8
9
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
  • 安装kubelet kubeadm kubectl
1
2
yum install -y kubelet kubeadm kubectl
systemctl enable kubelet && systemctl start kubelet
使用ubuntu:
1
2
3
4
5
6
7
apt-get update && apt-get install -y apt-transport-https
curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl

使用kubeadm启动k8s

  • 在node1(master)中执行
1
2
3
4
kubeadm init --apiserver-advertise-address={这里填写node1的host-only网卡的地址} --pod-network-cidr=10.244.0.0/16 --ignore-preflight-errors=swap
#--apiserver-advertise-address 这个参数是k8s集群中master对外能访问的地址
#--pod-network-cidr=10.244.0.0/16 这一节是配置pod的内网网段
#--ignore-preflight-errors=swap 如果是使用swap启动的话,需要加这个参数
  1. --apiserver-advertise-address=192.168.56.101 绑定 apiserver 到 master 节点的 Host-Only 适配器的地址,默认是绑到 NAT 的地址上,这样其他机器是永远也访问不到的。
  2. --pod-network-cidr=10.244.0.0/16 指定 pod 网络地址空间,我们使用 flannel 组件必须使用这个空间
    • 等待node1执行结束,会有以下的输出:

配置kubectl,使得能连上k8s的apiserver

这时候需要使用kubectl接入kubernets的api,在我们刚刚的kubeadm init时候,程序已经为我们创建了kubectl的配置文件,这时候我们只需要export到环境变量即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
1.如果是root用户的话
# root user
export KUBECONFIG=/etc/kubernetes/admin.conf

2.如果是非root用户的话
# non-root user
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

3.如果从其他机器操作的话
# 从本地主机操作,需要在本地安装 kubectl 客户端
mkdir -p ~/.kube
scp <username>@{远端服务器}:/home/<username>/.kube/config ~/.kube/config # 从 master 复制配置文件到本地
#把远端服务器的admin.conf拷贝到本地

以上的操作其实是把kubectl需要用到的配置文件配置到kubectl的配置当中

当完成了以上操作后,kuberctl已经能使用了

  • 在终端输入:
1
kubectl cluster-info
  • 会有类似下面的输出:

这时候kubectl命令是已经能正常连上api server,集群也处于可用状态

安装flannel网络

  • 可以通过修改kube-flannel.yml文件去修改flannel的默认监听端口
1
2
3
4
5
6
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

给 /opt/bin/flanneld 命令添加 --iface="br0" 参数
#按照实际情况进行配置(一般情况下不需要)

kubectl apply -f kube-flannel.yml
  • 测试配置
1
2
3
kubectl get pods --all-namespaces -o wide 
# 稍等一会,下载镜像需要一定时间,
#最后应该显示 flannel pods 是 Running 状态, kube-dns 也是 Running 状态

​ 如图:

让master节点也参与调度

如果需要在master也进行pod调度(k8s默认不进行pod调度) 执行以下指令

1
2
3
# taint命令用于配置污点
#k8s通过设定是否能容忍污点
kubectl taint nodes --all node-role.kubernetes.io/master-

其他节点加入集群

  • 此时需要在要加入集群的服务器上面执行以下指令(当然网段要能访问到,并且已经安装了kubeadm)
1
kubeadm join xxxxxxxxx:6443 --token xxxxxx.xxxxxxxx --discovery-token-ca-cert-hash sha256:xxxxxxxxxxxxxxx

这时候会出现以下的信息,说明已经成功加入了集群

安装和配置kubernetes-dashboard

安装kubernetes-dashboard

  • 下载官方kubernetes-dashboard的k8s资源文件

    1
    curl -L http://raw.githubusercontent.com/kubernetes/dashboard/v1.10.1/src/deploy/recommended/kubernetes-dashboard.yaml -O
  • 把资源文件应用到k8s集群

    1
    kubectl create -f kubernetes-dashboard.yaml
  • 等待dashboard 完全启动,使用以下命令确认

  • 此时,kubernetes-dashboard已经部署

配置kubernetes-dashboard的rbac策略

kubernetes-dashboard比较坑的地方在于

  • 如果没有配置策略,那么在启动kubernetes-dashboard的时候会出现很多的warning,然后即使能登陆到kubernetes-dashboard,也无法访问里面的资源

  • 配置rbac策略

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #admin-user-admin.rbac.yaml
    apiVersion: v1
    kind: ServiceAccount
    metadata:
    name: admin-user
    namespace: kube-system
    ---
    # Create ClusterRoleBinding
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRoleBinding
    metadata:
    name: admin-user
    roleRef:
    apiGroup: rbac.authorization.k8s.io
    kind: ClusterRole
    name: cluster-admin
    subjects:
    - kind: ServiceAccount
    name: admin-user
    namespace: kube-system
  • 应用rbac策略到k8s集群

    1
    kubectl create -f admin-user-admin.rbac.yaml

得到用于登陆dashboard的secret

  • 运行命令
1
kubectl -n kube-system describe secret $(kubectl -n kube-system get secret | grep admin-user|awk '{print $1}')
  • 会得到以下的token
1
2
3
4
5
6
7
8
9
10
11
12
13
Name:         admin-user-token-hmctl
Namespace: kube-system
Labels: <none>
Annotations: kubernetes.io/service-account.name: admin-user
kubernetes.io/service-account.uid: 00774986-5066-11e9-a0e8-fe242749c541

Type: kubernetes.io/service-account-token

Data
====
ca.crt: 1025 bytes
namespace: 11 bytes
token: xxxxxxxxxxxxx

使用kubectl proxy在本地打开dashboard

1
kubectl proxy
  • 访问dashboard

本地浏览器地址栏输入:

localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

会出现如下的页面:

  • 输入刚刚拿到的令牌

    如果没有配置rbac策略,在这个时候,使用令牌即使以admin-user登陆进去,也不能访问里面的资源

  • 然后进入dashboard界面,如下:

此时,已经可以正常访问了

生活再忙,也不要忘记生活原本简单的样子
0%