1. 首页
  2. Kubernetes

kubeadm安装Kubernetes1.14集群

本文演示如何使用 kubeadm 部署由三个节点组成的 Kubernetes 集群。

1. 环境说明

IP地址master/nodeOS版本
10.100.4.180masterCentOS7.6.1810
10.100.4.181node01CentOS7.6.1810
10.100.4.182node02CentOS7.6.1810

2. 准备工作

2.1 修改主机内核参数

三个节点上执行

# 加载内核模块
modprobe br_netfilter

cat <<EOF >>  /etc/sysctl.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1
EOF

sysctl -p

2.2 关闭 swap

三个节点上执行

swapoff -a

sed -i '/swap/ s/^\(.*\)$/#\1/g'  /etc/fstab

2.3 其它工作

三个节点上执行

  1. 关闭selinux
  2. 关闭 iptables、firewalld
  3. 配置时间同步

2.4 配置阿里云yum源

三个节点上执行

cd /etc/yum.repos.d/
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

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

3. 安装 docker-ce kubelet kubeadm kubectl

以下操作在三台节点执行

yum -y install docker-ce kubelet kubeadm kubectl

注意:其中两台 node 节点可以不安装 kubectl 管理命令

4. 启动 docker

以下操作在三台节点执行

systemctl enable docker && systemctl start docker

5. 配置 kubelet 开机自启

以下操作在三台节点执行

systemctl enable kubelet

6. 配置 kubelet 忽略 swap 错误

以下操作在三台节点执行

vim /etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS="--fail-swap-on=false"

7. kubeadm init 初始化

在 master 节点上执行操作

注意:在执行 kubeadm init 时,会下载一些镜像到本地,出于某种不可描述的原因,国内无法下载,为此我这里提前下载好了相关镜像,并使用 docker save 将所有镜像打包成了一个压缩包,并上传到云盘中供大家学习使用。

下载链接: https://pan.baidu.com/s/1yQ-3tV_700LHy2KmORBoMg

如果你想自己下载镜像,可以使用下面命令查看需要下载的镜像有哪些然后自己下载上传

root@k8s-master-opsbj:~ # kubeadm config images list
k8s.gcr.io/kube-apiserver:v1.14.1
k8s.gcr.io/kube-controller-manager:v1.14.1
k8s.gcr.io/kube-scheduler:v1.14.1
k8s.gcr.io/kube-proxy:v1.14.1
k8s.gcr.io/pause:3.1
k8s.gcr.io/etcd:3.3.10
k8s.gcr.io/coredns:1.3.1

7.1 将镜像下载到 master 节点然后导入镜像

root@k8s-master-opsbj:~ # docker load -i kubernetes-v1.14.1-kubeadm.tar.gz

然后把镜像复制到其它两台 node 节点导入镜像。

查看准备好的镜像:

root@k8s-master-opsbj:~ # docker images
REPOSITORY                           TAG                 IMAGE ID            CREATED             SIZE
k8s.gcr.io/kube-proxy                v1.14.1             20a2d7035165        3 weeks ago         82.1MB
k8s.gcr.io/kube-apiserver            v1.14.1             cfaa4ad74c37        3 weeks ago         210MB
k8s.gcr.io/kube-scheduler            v1.14.1             8931473d5bdb        3 weeks ago         81.6MB
k8s.gcr.io/kube-controller-manager   v1.14.1             efb3887b411d        3 weeks ago         158MB
k8s.gcr.io/coredns                   1.3.1               eb516548c180        3 months ago        40.3MB
k8s.gcr.io/etcd                      3.3.10              2c4adeb21b4f        5 months ago        258MB
k8s.gcr.io/pause                     3.1                 da86e6ba6ca1        16 months ago       742kB

7.2 初始化集群

在初始化集群之前我们先了解几个 kubeadm init 的参数作用:

# 为 control plane 选择一个特定的 Kubernetes 版本。
--kubernetes-version string     缺省值: "stable-1"

# 指明 pod 网络可以使用的 IP 地址段。 如果设置了这个参数,control plane 将会为每一个节点自动分配 CIDRs 。
--pod-network-cidr string

# 为 service 的虚拟IP地址另外指定IP地址段
--service-cidr string     缺省值: "10.96.0.0/12"

# 忽视检查项错误列表,列表中的每一个检查项如发生错误将被展示输出为警告,而非错误。 例如: 'IsPrivilegedUser,Swap'. 如填写为 'all' 则将忽视所有的检查项错误.
--ignore-preflight-errors stringSlice

了解上面几个参数,接下来我们就可以初始化集群了

root@k8s-master-opsbj:~ # kubeadm init --kubernetes-version=v1.14.1 --pod-network-cidr=10.244.0.0/14 --service-cidr=10.96.0.0/12 --ignore-preflight-errors=Swap

初始化集群成功后你会看到如下信息:

# 你的 Kubernetes 集群已经初始化成功
Your Kubernetes control-plane has initialized successfully!

# 要开始使用集群,您需要以普通用户的身份运行以下代码,我这里为了方便直接使用root用户
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 10.100.4.180:6443 --token 730lqx.qt88ypcp6o6erqnl \
    --discovery-token-ca-cert-hash sha256:99706ae95d169593c14abf28616f58e2660e0d97dece614437a8207a88926b36

注意:建议将上面信息中 kubeadm join 那段命令保存起来,后续 node 节点加入集群还会使用到。

7.3 在 master 节点根据提示信息操作

root@k8s-master-opsbj:~ # mkdir -p $HOME/.kube
root@k8s-master-opsbj:~ # sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
root@k8s-master-opsbj:~ # sudo chown $(id -u):$(id -g) $HOME/.kube/config

这里复制的 admin.conf 是 kubeadm 帮我们生成的一个为 kubectl 连接 apiserver 的认证文件,非常重要。

检查 master 节点组件状态:

root@k8s-master-opsbj:~ # kubectl get cs
NAME                 STATUS    MESSAGE             ERROR
scheduler            Healthy   ok
controller-manager   Healthy   ok
etcd-0               Healthy   {"health":"true"}

8. 安装 flannel 网络插件

在 master 节点上操作

flannel 项目地址:https://github.com/coreos/flannel

在 flannel 项目中,『Deploying flannel manually』告诉了我们改如何部署 flannel

root@k8s-master-opsbj:~ # kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
podsecuritypolicy.extensions/psp.flannel.unprivileged created
clusterrole.rbac.authorization.k8s.io/flannel created
clusterrolebinding.rbac.authorization.k8s.io/flannel created
serviceaccount/flannel created
configmap/kube-flannel-cfg created
daemonset.extensions/kube-flannel-ds-amd64 created
daemonset.extensions/kube-flannel-ds-arm64 created
daemonset.extensions/kube-flannel-ds-arm created
daemonset.extensions/kube-flannel-ds-ppc64le created
daemonset.extensions/kube-flannel-ds-s390x created

检查 flannel pod 是否处于 running 状态

root@k8s-master-opsbj:~ # kubectl get pods -n kube-system
NAME                                           READY   STATUS    RESTARTS   AGE
coredns-fb8b8dccf-k6tzh                        0/1     Pending   0          15m
coredns-fb8b8dccf-qvs9h                        0/1     Pending   0          15m
etcd-k8s-master-opsbj.com                      1/1     Running   0          13m
kube-apiserver-k8s-master-opsbj.com            1/1     Running   0          14m
kube-controller-manager-k8s-master-opsbj.com   1/1     Running   0          14m
kube-flannel-ds-amd64-tznjk                    1/1     Running   0          41s
kube-proxy-8ps9d                               1/1     Running   0          15m
kube-scheduler-k8s-master-opsbj.com            1/1     Running   0          13m

9. 配置 node 节点加入到集群中

node 节点要加入到集群中,只需要执行 master 节点执行 kubeadm init 成功后 给出的 kubeadm join 那段命令就可以了,不过需要注意的是,如果你的节点开启了 swap 那么也需要加上 –ignore-preflight-errors=Swap 忽略 swap 错误的选项;

在两台 node 节点上执行操作

kubeadm join 10.100.4.180:6443 --token 730lqx.qt88ypcp6o6erqnl \
    --discovery-token-ca-cert-hash sha256:99706ae95d169593c14abf28616f58e2660e0d97dece614437a8207a88926b36

10. 检查集群是否搭建成功

在 master 节点上如果以下状态都正常,就说明搭建成功了。

10.1 查看节点状态

root@k8s-master-opsbj:~ # kubectl get nodes
NAME                   STATUS   ROLES    AGE     VERSION
k8s-master-opsbj.com   Ready    master   21m     v1.14.1
k8s-node01-opsbj.com   Ready    <none>   5m16s   v1.14.1
k8s-node02-opsbj.com   Ready    <none>   4m43s   v1.14.1

10.2 查看组件状态

root@k8s-master-opsbj:~ # kubectl get cs
NAME                 STATUS    MESSAGE             ERROR
scheduler            Healthy   ok
controller-manager   Healthy   ok
etcd-0               Healthy   {"health":"true"}

10.3 查看集群信息

root@k8s-master-opsbj:~ # kubectl cluster-info
Kubernetes master is running at https://10.100.4.180:6443
KubeDNS is running at https://10.100.4.180:6443/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy

11. 测试集群功能是否正常

我们创建一个 nginx 的 Deployment 对象验证,mynginx.yaml

apiVersion: v1
kind: Service
metadata:
  name: mynginx-svc
spec:
  type: NodePort
  selector:
    app: nginx
  ports:
  - name: http
    port: 80
    targetPort: 80
    nodePort: 31384
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: mynginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: mynginx
        image: nginx:1.14.1
        imagePullPolicy: IfNotPresent
        ports:
        - name: http
          containerPort: 80

然后创建对象

root@k8s-master-opsbj:~ # kubectl apply -f mynginx.yaml
service/mynginx-svc created
deployment.extensions/mynginx created

查看 Pod 状态

root@k8s-master-opsbj:~ # kubectl get pods -o wide
NAME                       READY   STATUS    RESTARTS   AGE    IP           NODE                   NOMINATED NODE   READINESS GATES
mynginx-74dc88d7b6-bzmwh   1/1     Running   0          2m4s   10.244.1.2   k8s-node01-opsbj.com   <none>           <none>
mynginx-74dc88d7b6-kpwwt   1/1     Running   0          2m4s   10.244.2.2   k8s-node02-opsbj.com   <none>           <none>

查看 Service 状态

root@k8s-master-opsbj:~ # kubectl get svc
NAME          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes    ClusterIP   10.96.0.1       <none>        443/TCP        36m
mynginx-svc   NodePort    10.110.111.80   <none>        80:31384/TCP   86s

在浏览器中输入任意 node 节点的 IP:31384 查看能否访问

验证Kubernetes集群功能
验证Kubernetes集群功能

至此使用 kubeadm 部署一个可供学习使用的 Kubernetes 集群就完成了。

如果觉得文章不错,不妨给个『打赏』写作不易,各位的支持,能激发和鼓励我更大的写作热情。谢谢

原创文章,作者:恩志,如若转载,请注明出处:https://www.xbzdr.com/633.html

发表评论

电子邮件地址不会被公开。 必填项已用*标注

联系我们

在线咨询:点击这里给我发消息

邮件:510749025@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

QR code