kubeadm搭建kubernetes(v1.13.1)单节点集群

kubeadm是Kubernetes官方提供的用于快速部署Kubernetes集群的工具,本篇文章使用kubeadm搭建一个单master节点的k8s集群。

节点部署信息

节点主机名 节点IP 节点角色 操作系统
k8s-master 10.10.55.113 master centos7.6
k8s-node1 10.10.55.114 node centos7.6

节点说明

master:控制节点。kube-apiserver负责API服务,kube-controller-manager负责容器编排,kube-scheduler负责调度

node:工作节点。kubelet 主要负责同容器运行时(比如 Docker 项目)打交道。而这个交互所依赖的,是一个称作 CRI(Container Runtime Interface)的远程调用接口,这个接口定义了容器运行时的各项核心操作,比如:启动一个容器需要的所有参数

master核心组件 node核心组件
kube-apiserver kubelet
kube-controller-manager  
kube-scheduler  

一、基础环境准备

以下操作无特殊说明均在每个节点执行。

修改主机名

#master节点:
hostnamectl set-hostname k8s-master
#node1节点:
hostnamectl set-hostname k8s-node1

基本配置

#修改/etc/hosts文件
cat >> /etc/hosts << EOF
10.10.55.113 k8s-master
10.10.55.114 k8s-node1
EOF

#关闭防火墙和selinux
systemctl stop firewalld && systemctl disable firewalld
sed -i ‘s/^SELINUX=enforcing$/SELINUX=disabled/‘ /etc/selinux/config && setenforce 0

#关闭swap
swapoff -a
yes | cp /etc/fstab /etc/fstab_bak
cat /etc/fstab_bak |grep -v swap > /etc/fstab

设置网桥包经过iptalbes

RHEL / CentOS 7上的一些用户报告了由于iptables被绕过而导致流量路由不正确的问题。创建/etc/sysctl.d/k8s.conf文件,添加如下内容:

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

# 使配置生效
modprobe br_netfilter
sysctl -p /etc/sysctl.d/k8s.conf

修改iptables filter表中FOWARD链的默认策略(pllicy)为ACCEPT

iptables -P FORWARD ACCEPT

kube-proxy开启ipvs的前提条件

由于ipvs已经加入到了内核的主干,所以为kube-proxy开启ipvs的前提需要加载以下的内核模块:
在所有的Kubernetes节点执行以下脚本:

cat > /etc/sysconfig/modules/ipvs.modules <<EOF
#!/bin/bash
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
EOF

#执行脚本
chmod 755 /etc/sysconfig/modules/ipvs.modules && bash /etc/sysconfig/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4

#查看是否已经正确加载所需的内核模块lsmod | grep -e ip_vs -e nf_conntrack_ipv4

上面脚本创建了/etc/sysconfig/modules/ipvs.modules文件,保证在节点重启后能自动加载所需模块。 使用lsmod | grep -e ip_vs -e nf_conntrack_ipv4命令查看是否已经正确加载所需的内核模块。
接下来还需要确保各个节点上已经安装了ipset软件包。 为了便于查看ipvs的代理规则,最好安装一下管理工具ipvsadm。

yum install ipset
yum install ipset ipvsadm -y

安装docker

Kubernetes默认的容器运行时仍然是Docker,使用的是kubelet中内置dockershim CRI实现。需要注意的是,Kubernetes 1.13最低支持的Docker版本是1.11.1,最高支持是18.06,而Docker最新版本已经是18.09了,故我们安装时需要指定版本为18.06.1-ce

#配置docker yum源
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

#安装指定版本,这里安装18.06
yum list docker-ce --showduplicates | sort -r
yum install -y docker-ce-18.06.1.ce-3.el7
systemctl start docker && systemctl enable docker

#启用dockersystemctl enable dockersudo systemctl start docker

#测试docker是否安装成功docker run hello-world

安装kubeadm、kubelet、kubectl

官方安装文档可以参考:
https://kubernetes.io/docs/setup/independent/install-kubeadm/

kubelet 在群集中所有节点上运行的核心组件, 用来执行如启动pods和containers等操作。
kubeadm 引导启动k8s集群的命令行工具,用于初始化 Cluster。
kubectl 是 Kubernetes 命令行工具。通过 kubectl 可以部署和管理应用,查看各种资源,创建、删除和更新各种组件。

#配置kubernetes.repo的源,由于官方源国内无法访问,这里使用阿里云yum源
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
yum install -y kubelet-1.13.1 kubeadm-1.13.1 kubectl-1.13.1

#启动kubelet服务
systemctl enable kubelet && systemctl start kubelet

二、部署master节点

Master节点执行初始化:

注意这里执行初始化用到了- -image-repository选项,指定初始化需要的镜像源从阿里云镜像仓库拉取。--ignore-preflight-errors=Swap,忽略系统swap错误警告

kubeadm init    --kubernetes-version=v1.13.1    --pod-network-cidr=10.244.0.0/16    --image-repository registry.aliyuncs.com/google_containers    --apiserver-advertise-address=10.10.55.113    --ignore-preflight-errors=Swap

等待执行完成后,会看到类似如下的提示,后续加入kubernetes集群要用到

kubeadm join 10.10.55.113:6443 --token x66sy3.7e2u4um7etb3zk57 --discovery-token-ca-cert-hash sha256:147a0920ac265d668e54fea59af4fb570660eccd178ca1c247c0c018286478a3

配置 kubectl

kubectl 是管理 Kubernetes Cluster 的命令行工具,前面我们已经在所有的节点安装了 kubectl。Master 初始化完成后需要做一些配置工作,然后 kubectl 就能使用了。
依照 kubeadm init 输出的最后提示,推荐用 Linux 普通用户执行 kubectl。

创建普通用户centos

#创建普通用户并设置密码123456
useradd centos && echo "centos:123456" | chpasswd centos

#追加sudo权限,并配置sudo免密
sed -i ‘/^root/a\centos  ALL=(ALL)       NOPASSWD:ALL‘ /etc/sudoers

#保存集群安全配置文件到当前用户.kube目录
su - centos
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

#启用 kubectl 命令自动补全功能(注销重新登录生效)
echo "source <(kubectl completion bash)" >> ~/.bashrc

需要这些配置命令的原因是:Kubernetes 集群默认需要加密方式访问。所以,这几条命令,就是将刚刚部署生成的 Kubernetes 集群的安全配置文件,保存到当前用户的.kube 目录下,kubectl 默认会使用这个目录下的授权信息访问 Kubernetes 集群。
如果不这么做的话,我们每次都需要通过 export KUBECONFIG 环境变量告诉 kubectl 这个安全配置文件的位置。
配置完成后centos用户就可以使用 kubectl 命令管理集群了。

查看集群状态:

确认各个组件都处于healthy状态。

[[email protected] ~]# kubectl get cs
NAME                 STATUS    MESSAGE              ERROR
controller-manager   Healthy   ok
scheduler            Healthy   ok
etcd-0               Healthy   {"health": "true"}

部署网络插件(这里使用flannerl)

wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

kubectl apply -f  kube-flannel.yml

安装完成确保所有pod处于running状态

kubectl get pod --all-namespaces -o wide

#或者如下命令(-n kube-system意思为命名空间kube-system下pod的状态)kubectl get pods -n kube-system

此时master节点的状态为ready

[[email protected] ~]# kubectl get nodes
NAME         STATUS   ROLES    AGE   VERSION
k8s-master   Ready    master   8d    v1.13.1

安装出现问题

#日志 (coredns-78d4cf999f-qhb7p指 pod的name)
kubectl logs coredns-78d4cf999f-qhb7p -n kube-system

#节点详情
kubectl describe pods coredns-78d4cf999f-qhb7p -n kube-system

尝试重新安装

kubeadm reset

ifconfig cni0 down
ip link delete cni0

ifconfig flannel.1 down
ip link delete flannel.1

rm -rf /var/lib/cni/

三、部署node节点

node加入kubernetes集群

#执行以下命令将节点接入集群
kubeadm join 10.10.55.113:6443 --token x66sy3.7e2u4um7etb3zk57 --discovery-token-ca-cert-hash sha256:147a0920ac265d668e54fea59af4fb570660eccd178ca1c247c0c018286478a3
#如果执行kubeadm init时没有记录下加入集群的命令,可以通过以下命令重新创建
kubeadm token create --print-join-command

查看节点状态

[[email protected] ~]# kubectl get nodes
NAME         STATUS   ROLES    AGE   VERSION
k8s-master   Ready    master   8d    v1.13.1
k8s-node1    Ready    <none>   8d    v1.13.1

确保组件为running

[[email protected] ~]# kubectl get pods -n kube-system
NAME                                 READY   STATUS    RESTARTS   AGE
coredns-78d4cf999f-77ql5             1/1     Running   0          8d
coredns-78d4cf999f-qhb7p             1/1     Running   0          8d
etcd-k8s-master                      1/1     Running   0          8d
kube-apiserver-k8s-master            1/1     Running   0          8d
kube-controller-manager-k8s-master   1/1     Running   1          8d
kube-flannel-ds-amd64-2272z          1/1     Running   0          8d
kube-flannel-ds-amd64-zlgxf          1/1     Running   0          8d
kube-proxy-hwptn                     1/1     Running   0          8d
kube-proxy-p6cg2                     1/1     Running   0          8d
kube-scheduler-k8s-master            1/1     Running   1          8d

如果pod状态为Pending、ContainerCreating、ImagePullBackOff 都表明 Pod 没有就绪,Running 才是就绪状态。
如果有pod提示失败,我们可以通过 kubectl describe pod 查看 Pod 具体情况,以具体分析解决问题

四、测试集群各个组件是否正常

首先验证kube-apiserver, kube-controller-manager, kube-scheduler, pod network 是否正常:
部署一个 Nginx Deployment,包含2个Pod

[[email protected] ~]# kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
my-saas-service 1/1 1 1 5d5h
my-saas-web 1/1 1 1 3d23h
[[email protected] ~]# kubectl create deployment nginx --image=nginx:alpine
deployment.apps/nginx created
[[email protected] ~]# kubectl scale deployment nginx --replicas=2
deployment.extensions/nginx scaled
[[email protected] ~]# kubectl get pods -l app=nginx -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-54458cd494-cgqgf 1/1 Running 0 13s 10.244.1.36 k8s-node1 <none> <none>
nginx-54458cd494-gkhlb 1/1 Running 0 8s 10.244.1.37 k8s-node1 <none> <none>

再验证一下kube-proxy是否正常:

以 NodePort 方式对外提供服务

[[email protected] ~]# kubectl expose deployment nginx --port=80 --type=NodePort
service/nginx exposed
[[email protected]-node1 ~]# kubectl get services nginx
NAME    TYPE       CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
nginx   NodePort   10.102.34.74   <none>        80:31782/TCP   4s

可以通过任意 NodeIP:Port 在集群外部访问这个服务:

[[email protected] ~]# curl 10.10.55.113:31782
[[email protected]-node1 ~]# curl 10.10.55.114:31782
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

最后验证一下dns, pod network是否正常:

运行Busybox并进入交互模式

[[email protected] ~]# kubectl run -it curl --image=radial/busyboxplus:curl
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
If you don‘t see a command prompt, try pressing enter.

输入nslookup nginx查看是否可以正确解析出集群内的IP,以验证DNS是否正常

[ [email protected]:/ ]$ nslookup nginx
Server:    10.96.0.10
Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local

Name:      nginx
Address 1: 10.102.34.74 nginx.default.svc.cluster.local

通过服务名进行访问,验证kube-proxy是否正常

[ [email protected]:/ ]$ curl http://nginx/
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
  ...
</body>
</html>

退出 exit

kube-proxy开启ipvs

修改ConfigMap的kube-system/kube-proxy中的config.conf,mode: “ipvs”:

kubectl edit cm kube-proxy -n kube-system

之后重启各个节点上的kube-proxy pod:

kubectl get pod -n kube-system | grep kube-proxy | awk ‘{system("kubectl delete pod "$1" -n kube-system")}‘

查看状态

kubectl get pod -n kube-system | grep kube-proxy

查看日志

kubectl logs kube-proxy-pf55q -n kube-system

日志中打印出了Using ipvs Proxier,说明ipvs模式已经开启。

备注:删除节点和集群

如何从集群中移除k8s-node2 (是k8s-node2)?

首先要排除节点,并确保该节点为空, 然后再将其关闭。

1. 在master节点上执行:

kubectl drain k8s-node2   --delete-local-data --force --ignore-daemonsets
kubectl delete node k8s-node2  

2. 在子节点k8s-node2  上执行:

kubeadm reset
ifconfig cni0 down
ip link delete cni0
ifconfig flannel.1 down
ip link delete flannel.1
rm -rf /var/lib/cni/

3.在子节点 k8s-node1上执行

kubectl delete node k8s-node2 

注意:

在master上删除node并不会清理k8s-node2运行的容器,需要在删除节点上面手动运行清理命令。
如果你想重新配置集群,使用新的参数重新运行kubeadm init或者kubeadm join即可。

到此,kubeadm搭建kubernetes(v1.13.1)单节点集群搭建完成,后续可以继续添加node节点,或者部署dashboard、helm包管理工具、EFK日志系统、Prometheus Operator监控系统、rook+ceph存储系统等组件

参考:

https://blog.csdn.net/networken/article/details/84991940

https://www.kubernetes.org.cn/4956.html

关于kubernetes生产高可用集群搭建待续

原文地址:https://www.cnblogs.com/haoprogrammer/p/10245561.html

时间: 2024-08-24 14:22:46

kubeadm搭建kubernetes(v1.13.1)单节点集群的相关文章

redis单节点集群

一.概念 redis是一种支持Key-Value等多种数据结构的存储系统.可用于缓存.事件发布或订阅.高速队列等场景.该数据库使用ANSI C语言编写,支持网络,提供字符串.哈希.列表.队列.集合结构直接存取,基于内存,可持久化. 二.redis的应用场景有哪些 1.会话缓存(最常用) 2.消息队列,比如支付 3.活动排行榜或计数 4.发布.订阅消息(消息通知) 5.商品列表.评论列表等 1.redis安装: # wget http://download.redis.io/releases/re

kubeadm部署kubernetes v1.17.4 单master节点

环境说明: #操作系统:centos7 #docker版本:19.03.8#kubernetes版本:v1.17.4#K8S master 节点IP:192.168.3.62#K8S worker节点IP:192.168.2.186#网络插件:flannel#kube-proxy网络转发: ipvs#kubernetes源:使用阿里云源#service-cidr:10.96.0.0/16 #pod-network-cidr:10.244.0.0/16 部署准备: 操作在所有节点进行 修改内核参数

Hadoop学习笔记(二)设置单节点集群

本文描述如何设置一个单一节点的 Hadoop 安装,以便您可以快速执行简单的操作,使用 Hadoop MapReduce 和 Hadoop 分布式文件系统 (HDFS). 参考官方文档:Hadoop MapReduce Next Generation - Setting up a Single Node Cluster. Hadoop版本:Apache Hadoop 2.5.1 系统版本:CentOS 6.5,内核(uname -r):2.6.32-431.el6.x86_64 系统必备组件 支

Hadoop学习笔记(两)设置单节点集群

本文描写叙述怎样设置一个单一节点的 Hadoop 安装.以便您能够高速运行简单的操作,使用 Hadoop MapReduce 和 Hadoop 分布式文件系统 (HDFS). 參考官方文档:Hadoop MapReduce Next Generation - Setting up a Single Node Cluster. Hadoop版本号:Apache Hadoop 2.5.1 系统版本号:CentOS 6.5.内核(uname -r):2.6.32-431.el6.x86_64 系统必备

Cassandra配置多节点集群

上一篇文章 Cassandra入门指南中,我们已经配置好了一个单节点集群,接下来,我们要往这个集群中多加几个节点,看看多个节点是如何同时工作的. Cassandra节点之间交换信息是通过一种叫做Gossip(暂时不知道该翻译为哪个专有名词合适,暂且意会吧)的机制.但是要想让一个消息传递到一个新加入的节点,至少还需要知道另外一个节点,这个节点叫做种子(Seed).通常我们会选择一小部分相对稳定的节点作为种子节点,但这并不是硬性规定.务必要确保每个种子节点至少能感知另外一个种子节点.记住,这样做的目

[转贴]CentOS7.5 Kubernetes V1.13(最新版)二进制部署集群

CentOS7.5 Kubernetes V1.13(最新版)二进制部署集群 http://blog.51cto.com/10880347/2326146 一.概述 kubernetes 1.13 已发布,这是 2018 年年内第四次也是最后一次发布新版本.Kubernetes 1.13 是迄今为止发布间隔最短的版本之一(与上一版本间隔十周),主要关注 Kubernetes 的稳定性与可扩展性,其中存储与集群生命周期相关的三项主要功能已逐步实现普遍可用性. Kubernetes 1.13 的核心

kubeadm安装kubernetes 1.13.2多master高可用集群

1. 简介 Kubernetes v1.13版本发布后,kubeadm才正式进入GA,可以生产使用,用kubeadm部署kubernetes集群也是以后的发展趋势.目前Kubernetes的对应镜像仓库,在国内阿里云也有了镜像站点,使用kubeadm部署Kubernetes集群变得简单并且容易了很多,本文使用kubeadm带领大家快速部署Kubernetes v1.13.2版本. 注意:请不要把目光仅仅放在部署上,如果你是新手,推荐先熟悉用二进制文件部署后,再来学习用kubeadm部署.二进制文

使用kubeadm安装kubernetes v1.14.1

使用kubeadm安装kubernetes v1.14.1 一.环境准备 操作系统:Centos 7.5 ? ? 一台或多台运?行行着下列列系统的机器?: ? Ubuntu 16.04+ ? Debian 9 ? CentOS 7 ? RHEL 7 ? Fedora 25/26 (尽?力力服务) ? HypriotOS v1.0.1+ ? Container Linux (针对1800.6.0 版本测试) ? 每台机器? 2 GB 或更更多的 RAM (如果少于这个数字将会影响您应?用的运?行行

Kubernetes v1.14.0 之 kube-apiserver集群部署

kube-apiserver集群准备 1.kube-apiserver 服务器配置 对外ip 内网ip cpu 内存 硬盘 192.168.3.10 172.172.1.1 64 256 1T 192.168.3.11 172.172.1.2 64 256 1T 192.168.3.12 172.172.1.3 64 256 1T 192.168.3.13 172.172.1.4 64 256 1T 192.168.3.14 172.172.1.5 64 256 1T 2.kube-apiser