前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >kubernetes 集群部署

kubernetes 集群部署

原创
作者头像
奶盖
修改2021-12-06 11:19:18
2.2K1
修改2021-12-06 11:19:18
举报
文章被收录于专栏:奶盖笔记奶盖笔记

基于red hat 的发行版本 centerOS

准备开始

  • 一台兼容的 Linux 主机。Kubernetes 项目为基于 Debian 和 Red Hat 的 Linux 发行版以及一些不提供包管理器的发行版提供通用的指令
  • 每台机器 2 GB 或更多的 RAM (如果少于这个数字将会影响你应用的运行内存)
  • 2 CPU 核或更多
  • 集群中的所有机器的网络彼此均能相互连接(公网和内网都可以)
  • 节点之中不可以有重复的主机名、MAC 地址或 product_uuid。请参见这里了解更多详细信息。
  • 开启机器上的某些端口。请参见这里 了解更多详细信息。
  • 禁用交换分区。为了保证 kubelet 正常工作,你 必须 禁用交换分区。

具体操作

设置三台机器的主机名

master上执行:

1

[root@localhost ~]# hostnamectl --static set-hostname k8s-master

node1上执行:

1

[root@localhost ~]# hostnamectl --static set-hostname k8s-node-1

node2上执行:

1

[root@localhost ~]# hostnamectl --static set-hostname k8s-node-2

设置hosts

在三台机器上设置hosts,均执行如下命令:

代码语言:javascript
复制
echo '192.168.17.149  k8s-master
192.168.17.150   k8s-node-1
192.168.17.151   k8s-node-2' >> /etc/hosts

关闭三台机器上的防火墙

代码语言:javascript
复制
systemctl disable firewalld.service
systemctl stop firewalld.service

设置时间同步

代码语言:javascript
复制
yum install ntpdate ‐y 
ntpdate time.windows.com

关闭swap

代码语言:javascript
复制
swapoff -a  #临时关闭
代码语言:javascript
复制
vim /etc/fstab   #永久关闭 

#注释掉swap这行

# /dev/mapper/centos‐swap swap swap defaults 0 0

systemctl reboot#重启生效

free ‐m #查看下swap交换区是否都为0,如果都为0则swap关闭成功

关闭selinux

代码语言:javascript
复制
sed ‐i "s/enforcing/disabled/" /etc/selinux/config  #永久关闭

允许 iptables 检查桥接流量

确保 br_netfilter 模块被加载。这一操作可以通过运行 lsmod | grep br_netfilter 来完成。若要显式加载该模块,可执行 sudo modprobe br_netfilter

为了让你的 Linux 节点上的 iptables 能够正确地查看桥接流量,你需要确保在你的 sysctl 配置中将 net.bridge.bridge-nf-call-iptables 设置为 1。例如:

代码语言:javascript
复制
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system

配置 cgroup 驱动程序

Docker 需要提前安装好。

安装docker

1.配置yum源(这里使用阿里云的源)

代码语言:javascript
复制
yum install wget -y 
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo

2. 安装docker

yum install docker-ce docker-ce-cli -y

或者使用rpm包安装

代码语言:javascript
复制
  yum list docker-ce --showduplicates | sort -r
  yum -y install docker-ce-18.06.1.ce-3.el7
  systemctl enable docker && systemctl start docke
  systemctl status docke

3.编辑docker配置文件

代码语言:javascript
复制
编辑/etc/docker/daemon.json
cat > /etc/docker/daemon.json << EOF
{
    "registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"],
    "exec-opts": ["native.cgroupdriver=systemd"]
}
EOF

3.启动docker服务

代码语言:javascript
复制
systemctl daemon-reload && systemctl enable docker && systemctl start docker

Docker 在默认情况下使用的 Cgroup Driver 为cgroupfs

而 Kubernetes 其实推荐使用systemd来代替cgroupfs

修改docker配置以适应kubelet (没有该文件就新建一个)

代码语言:javascript
复制
vi /etc/docker/daemon.json
{ 
    "registry-mirrors": ["https://registry.cn-hangzhou.aliyuncs.com"],
    "exec-opts": ["native.cgroupdriver=systemd"]
}
代码语言:javascript
复制
systemctl daemon-reload
代码语言:javascript
复制
systemctl restart docker
代码语言:javascript
复制
docker info | grep Cgroup*   #查看是否修改成功

加载ipvs模块 (master)

kubernete 开启ipvs 模式,主要修改kube-proxy 配置

Linux命令:modprobe 。功能说明:自动处理可载入模块。

lsmod 是一个命令行实用程序,用于显示有关已加载的Linux内核模块的信息

代码语言:javascript
复制
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4
lsmod | grep ip_vs
lsmod | grep nf_conntrack_ipv4
yum install -y ipvsadm ipset

【深度】这一次,彻底搞懂 kube-proxy IPVS 模式的工作原理! - 云+社区 - 腾讯云 (tencent.com)

安装 kubeadm、kubelet 和 kubectl

代码语言:javascript
复制
# 配置kubernates yum 源
cat <<EOF | sudo tee /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

# 将 SELinux 设置为 permissive 模式(相当于将其禁用)
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

# 安装最新版本
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

#查看可以安装的版本
yum list kubelet --showduplicates | sort -r

# 安装指定版本
yum install -y kubelet-1.18.8 kubeadm-1.18.8 kubectl-1.18.8

#开机启动 kubelet
#sudo systemctl enable --now kubelet
systemctl enable kubelet
systemctl start kubelet
  • 通过运行命令 setenforce 0sed ... 将 SELinux 设置为 permissive 模式 可以有效地将其禁用。 这是允许容器访问主机文件系统所必需的,而这些操作时为了例如 Pod 网络工作正常。 你必须这么做,直到 kubelet 做出对 SELinux 的支持进行升级为止。
  • 如果你知道如何配置 SELinux 则可以将其保持启用状态,但可能需要设定 kubeadm 不支持的部分配置

初始化控制平面节点(mater)

代码语言:javascript
复制
kubeadm init <args>

方式一:

控制平面节点是运行控制平面组件的机器, 包括 etcd (集群数据库) 和 API Server (命令行工具 kubectl 与之通信)。

  1. (推荐)如果计划将单个控制平面 kubeadm 集群升级成高可用, 你应该指定 --control-plane-endpoint 为所有控制平面节点设置共享端点。 端点可以是负载均衡器的 DNS 名称或 IP 地址。
  2. 选择一个 Pod 网络插件,并验证是否需要为 kubeadm init 传递参数。 根据你选择的第三方网络插件,你可能需要设置 --pod-network-cidr 的值。 请参阅 安装Pod网络附加组件
  3. (可选)从版本1.14开始,kubeadm 尝试使用一系列众所周知的域套接字路径来检测 Linux 上的容器运行时。 要使用不同的容器运行时, 或者如果在预配置的节点上安装了多个容器,请为 kubeadm init 指定 --cri-socket 参数。 请参阅安装运行时
  4. (可选)除非另有说明,否则 kubeadm 使用与默认网关关联的网络接口来设置此控制平面节点 API server 的广播地址。 要使用其他网络接口,请为 kubeadm init 设置 --apiserver-advertise-address=<ip-address> 参数。 要部署使用 IPv6 地址的 Kubernetes 集群, 必须指定一个 IPv6 地址,例如 --apiserver-advertise-address=fd00::101

所有节点安装之前记得先把镜像准备好,否者将无法启动,也不报错。

--pod-network-cidr=10.10.0.0/16

--service-cidr=10.20.0.0/16 # pod 和service 网段要区分开时设置

--kubernetes-version=v1.18.0 #指定安装的版本

--image-repository registry.aliyuncs.com/google_containers

--apiserver-advertise-address=k8s-master机器的ip

代码语言:javascript
复制
kubeadm init --apiserver-advertise-address=192.168.17.149 --image-repository registry.aliyuncs.com/google_containers --kubernetes-version v1.18.8 --pod-network-cidr=10.10.0.0/16 --service-cidr=10.20.0.0/16

--kubernetes-version v1.18.8 指定版本

--apiserver-advertise-address 为通告给其它组件的IP,一般应为master节点的IP地址

--service-cidr 指定service网络,不能和node网络冲突

--pod-network-cidr 指定pod网络,不能和node网络、service网络冲突

--image-repository registry.aliyuncs.com/google_containers 指定镜像源,由于默认拉取镜像地址k8s.gcr.io国内无法访问,这里指定阿里云镜像仓库地址。

如果k8s版本比较新,可能阿里云没有对应的镜像,就需要自己从其它地方获取镜像了。

--control-plane-endpoint 标志应该被设置成负载均衡器的地址或 DNS 和端口(可选)

方式二:

配置文件安装

1.生成文件命令

kubeadm config print init-defaults >init-config.yaml

2.修改init-config.yaml 配置内容,进行安装

kubeadm init --config=init-config.yaml

kubeadm init 命令执行成功 be like

代码语言:javascript
复制
Your Kubernetes control-plane has initialized successfully!

To start using your cluster, you need to run the following as a regular user:
  #需要执行以下命令,下面的命令是配置如何使用kubectl访问集群的方式
  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:
  /docs/concepts/cluster-administration/addons/

You can now join any number of machines by running the following on each node
as root:   #记得拷贝以下命令,用于node 节点加入集群

  kubeadm join <control-plane-host>:<control-plane-port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>

要使非 root 用户可以运行 kubectl,请运行以下命令, 它们也是 kubeadm init 输出的一部分:

代码语言:javascript
复制
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

或者,如果你是 root 用户,则可以运行:

代码语言:javascript
复制
export KUBECONFIG=/etc/kubernetes/admin.conf

#查看kubectl是否能正常使用

代码语言:javascript
复制
kubectl get nodes

安装 Pod 网络附加组件(master)

代码语言:javascript
复制
kubectl apply -f <add-on.yaml>

每个集群只能安装一个 Pod 网络。

安装 Pod 网络后,您可以通过在 kubectl get pods --all-namespaces 输出中检查 CoreDNS Pod 是否 Running 来确认其是否正常运行。 一旦 CoreDNS Pod 启用并运行,你就可以继续加入节点。

安装POD network Flannel(DamonSet)

代码语言:javascript
复制
wget https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

修改kube-flannel.yml

更改 128行的网络配置,要和 pod-network-cidr保持一致

cat kube-flannel.yml | grep Network

代码语言:javascript
复制
kubectl  apply -f kube-flannel.yaml

如果您的网络无法正常工作或 CoreDNS 不在“运行中”状态,请查看kubeadm故障排除指南

代码语言:javascript
复制
kubectl -n kube-system get pods -o wide   #查看是否创建成功

控制平面节点隔离(master可选)

默认情况下,出于安全原因,你的集群不会在控制平面节点上调度 Pod。 如果你希望能够在控制平面节点上调度 Pod, 例如用于开发的单机 Kubernetes 集群,请运行:

代码语言:javascript
复制
kubectl taint nodes --all node-role.kubernetes.io/master-

加入节点(NODE执行)

K8S集群node节点执行,master 节点init 成功后的命令

节点是你的工作负载(容器和 Pod 等)运行的地方。要将新节点添加到集群,请对每台计算机执行以下操作:

  • SSH 到机器
  • 成为 root (例如 sudo su -
  • 运行 kubeadm init 输出的命令。例如:
代码语言:javascript
复制
kubeadm join --token <token> <control-plane-host>:<control-plane-port> --discovery-token-ca-cert-hash sha256:<hash>
代码语言:javascript
复制
kubeadm join 192.168.17.149:6443 --token gfs8qb.shcvgzxrcflaw19m \
    --discovery-token-ca-cert-hash sha256:a47db38d409c8135969aeee18b1371230dfabfd8fed860691b02f717543a8f85 

如果没有令牌,可以通过在控制平面节点上运行以下命令来获取令牌:

代码语言:javascript
复制
kubeadm token list

令牌过期重新生成

代码语言:javascript
复制
kubeadm token create --print-join-command

(可选)从控制平面节点以外的计算机控制集群

为了使 kubectl 在其他计算机(例如笔记本电脑)上与你的集群通信, 你需要将管理员 kubeconfig 文件从控制平面节点复制到工作站,如下所示:

代码语言:javascript
复制
scp root@<control-plane-host>:/etc/kubernetes/admin.conf .
kubectl --kubeconfig ./admin.conf get nodes

问题:

在master 节点中无法ping 通 services 的 cluster-ip

原因 kube-proxy 未指定 mode 为ipvs模式

代码语言:javascript
复制
[root@k8s-master ~]# kubectl logs -n kube-system kube-proxy-sb4jf
W1203 20:40:41.062897       1 server_others.go:559] Unknown proxy mode "", assuming iptables proxy

kube-proxy使用了iptable模式,修改为ipvs模式

修改后可以正常ping通

代码语言:javascript
复制
[root@k8s-master ~]# kubectl get services -A
NAMESPACE     NAME             TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)                  AGE
default       kubernetes       ClusterIP   10.20.0.1      <none>        443/TCP                  26d
kube-system   kube-dns         ClusterIP   10.20.0.10     <none>        53/UDP,53/TCP,9153/TCP   26d
kube-system   kuboard          NodePort    10.20.82.143   <none>        80:32567/TCP             10h
kube-system   metrics-server   ClusterIP   10.20.254.12   <none>        443/TCP                  10h
[root@k8s-master ~]# ping 10.20.82.143
PING 10.20.82.143 (10.20.82.143) 56(84) bytes of data.
64 bytes from 10.20.82.143: icmp_seq=1 ttl=64 time=0.302 ms
64 bytes from 10.20.82.143: icmp_seq=2 ttl=64 time=0.060 ms

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 准备开始
  • 设置三台机器的主机名
  • 设置hosts
  • 关闭三台机器上的防火墙
  • 设置时间同步
  • 关闭swap
  • 关闭selinux
  • 允许 iptables 检查桥接流量
  • 配置 cgroup 驱动程序
  • 1.配置yum源(这里使用阿里云的源)
  • 2. 安装docker
  • 3.编辑docker配置文件
  • 3.启动docker服务
  • 加载ipvs模块 (master)
  • 安装 kubeadm、kubelet 和 kubectl
  • 初始化控制平面节点(mater)
    • 方式一:
      • 方式二:
      • 安装 Pod 网络附加组件(master)
        • 控制平面节点隔离(master可选)
          • 加入节点(NODE执行)
            • (可选)从控制平面节点以外的计算机控制集群
            相关产品与服务
            容器服务
            腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档