一、kubeadm 部署 K8S 集群架构

主机名 IP地址 安装组件
master(2C/4G,cpu核心数要求大于2) 192.168.160.20 docker、kubeadm、kubelet、kubectl、flannel
node01(2C/2G) 192.168.160.40 docker、kubeadm、kubelet、kubectl、flannel
node02(2C/2G) 192.168.160.90 docker、kubeadm、kubelet、kubectl、flannel
Harbor节点(hub.kgc.com) 192.168. 160.70 docker、docker-compose、harbor-offline-v1.2.2

部署的总体步骤如下:

1、在所有节点上安装Docker和kubeadm

2、部署Kubernetes Master

3、部署容器网络插件

4、部署 Kubernetes Node,将节点加入Kubernetes集群中

5、部署 Dashboard Web 页面,可视化查看Kubernetes资源

6、部署 Harbor 私有仓库,存放镜像资源

1、环境准备

//所有节点,关闭防火墙规则,关闭selinux,关闭swap交换

 
systemctl stop firewalld
systemctl disable firewalld
setenforce 0
iptables -F && iptables -t nat -F && iptables -t mangle -F && iptables -X
swapoff -a #交换分区必须要关闭
sed -ri 's/.*swap.*/#&/' /etc/fstab #永久关闭swap分区,&符号在sed命令中代表上次匹配的结果
#加载 ip_vs 模块
for i in $(ls /usr/lib/modules/$(uname -r)/kernel/net/netfilter/ipvs|grep -o "^[^.]*");do echo $i; /sbin/modinfo -F filename $i >/dev/null 2>&1 && /sbin/modprobe $i;done

//修改主机名

 
hostnamectl set-hostname master
hostnamectl set-hostname node01
hostnamectl set-hostname node02

//所有节点修改hosts文件

 
vim /etc/hosts
192.168.160.20 master
192.168.160.40 node01
192.168.160.90 node02

//调整内核参数

 
cat > /etc/sysctl.d/kubernetes.conf << EOF
#开启网桥模式,可将网桥的流量传递给iptables链
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
#关闭ipv6协议
net.ipv6.conf.all.disable_ipv6=1
net.ipv4.ip_forward=1
EOF

//生效参数

 
sysctl --system

2、所有节点安装docker

 
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io mkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://6g3b0w0w.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
}
}
EOF
#使用Systemd管理的Cgroup来进行资源控制与管理,因为相对Cgroupfs而言,Systemd限制CPU、内存等资源更加简单和成熟稳定。
#日志使用json-file格式类型存储,大小为100M,保存在/var/log/containers目录下,方便ELK等日志系统收集和管理日志。 systemctl daemon-reload
systemctl restart docker.service
systemctl enable docker.service docker info | grep "Cgroup Driver"

3、所有节点安装kubeadm,kubelet和kubectl

//定义kubernetes源,安装kubeadm,kubelet和kubectl

 
cat > /etc/yum.repos.d/kubernetes.repo << EOF
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=0
repo_gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF yum install -y kubelet-1.15.1 kubeadm-1.15.1 kubectl-1.15.1

//开机自启kubelet

 
systemctl enable kubelet.service  

#K8S通过kubeadm安装出来以后都是以Pod方式存在,即底层是以容器方式运行,所以kubelet必须设置开机自启

3、部署K8S集群

//查看初始化需要的镜像

 
kubeadm config images list

 
//在 master 节点上传 v1.20.11.zip压缩包至 /opt 目录

 
unzip v1.20.11.zip -d /opt/k8s
cd /opt/k8s/v1.20.11 for i in $(ls *.tar); do docker load -i $i; done

//复制镜像和脚本到 node 节点,并在 node 节点上执行脚本加载镜像文件

 
scp -r /opt/k8s root@node01:/opt
scp -r /opt/k8s root@node02:/opt

//初始化kubeadm

这里我用的是方法一

方法一:

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

cd /opt/
vim kubeadm-config.yaml
......
11 localAPIEndpoint:
12 advertiseAddress: 192.168.160.20 #指定master节点的IP地址
13 bindPort: 6443
......
34 kubernetesVersion: v1.20.11 #指定kubernetes版本号
35 networking:
36 dnsDomain: cluster.local
37 podSubnet: "10.244.0.0/16" #指定pod网段,10.244.0.0/16用于匹配flannel默认网段
38 serviceSubnet: 10.96.0.0/16 #指定service网段
39 scheduler: {}
--- #末尾再添加以下内容
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: ipvs #把默认的service调度方式改为ipvs模式 kubeadm init --config=kubeadm-config.yaml --experimental-upload-certs | tee kubeadm-init.log
#--experimental-upload-certs 参数可以在后续执行加入节点时自动分发证书文件,k8sV1.16版本开始替换为 --upload-certs
#tee kubeadm-init.log 用以输出日志

//查看 kubeadm-init 日志

 
less kubeadm-init.log

//kubernetes配置文件目录

 
ls /etc/kubernetes/

//存放ca等证书和密码的目录

 
ls /etc/kubernetes/pki

方法二:

 
kubeadm init \
--apiserver-advertise-address=192.168.160.20 \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version=v1.15.1 \
--service-cidr=10.1.0.0/16 \
--pod-network-cidr=10.244.0.0/16

--------------------------------------------------------------------------------------------
初始化集群需使用kubeadm init命令,可以指定具体参数初始化,也可以指定配置文件初始化。
可选参数:
--apiserver-advertise-address:apiserver通告给其他组件的IP地址,一般应该为Master节点的用于集群内部通信的IP地址,0.0.0.0表示节点上所有可用地址
--apiserver-bind-port:apiserver的监听端口,默认是6443
--cert-dir:通讯的ssl证书文件,默认/etc/kubernetes/pki
--control-plane-endpoint:控制台平面的共享终端,可以是负载均衡的ip地址或者dns域名,高可用集群时需要添加
--image-repository:拉取镜像的镜像仓库,默认是k8s.gcr.io
--kubernetes-version:指定kubernetes版本
--pod-network-cidr:pod资源的网段,需与pod网络插件的值设置一致。通常,Flannel网络插件的默认为10.244.0.0/16,Calico插件的默认值为192.168.0.0/16;
--service-cidr:service资源的网段
--service-dns-domain:service全域名的后缀,默认是cluster.local
---------------------------------------------------------------------------------------------

方法二初始化后需要修改 kube-proxy 的 configmap,开启 ipvs

 
kubectl edit cm kube-proxy -n=kube-system
修改mode: ipvs 提示:
......
Your Kubernetes control-plane has initialized successfully! 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 192.168.160.20:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:1e59b41e6e5cddb0d8b6798ab758bb1753ade0bb62037b8d1f22853d33333264

//在 node 节点上执行 kubeadm join 命令加入群集

 
kubeadm join 192.168.160.20:6443 --token abcdef.0123456789abcdef \
--discovery-token-ca-cert-hash sha256:1e59b41e6e5cddb0d8b6798ab758bb1753ade0bb62037b8d1f22853d33333264

//所有节点部署网络插件flannel
方法一:
//所有节点上传flannel镜像 flannel.tar 到 /opt 目录,master节点上传 kube-flannel.yml 文件

 
cd /opt
docker load -i flannel.tar

//在 master 节点创建 flannel 资源

 
kubectl apply -f kube-flannel.yml

如果状态还是NotReady,就替换新的cni成旧的cni,因为新的cni有污点,还有flannel.tar,重新下载镜像,kube-flannel.yml替换好了就行了

//在master节点查看节点状态(需要等几分钟)

 
kubectl get pods -n kube-system

//测试 pod 资源创建

 
kubectl create deployment nginx --image=nginx

kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-6799fc88d8-wltvk 0/1 ContainerCreating 0 22s <none> node01 <none> <none>

//暴露端口提供服务

 
kubectl expose deployment nginx --port=80 --type=NodePort
kubectl get svc

//扩展3个副本

 
kubectl scale deployment nginx --replicas=3
kubectl get pods -o wide

二、dashboard 部署

1、 安装dashboard

//所有节点安装dashboard
方法一:
//所有节点上传dashboard镜像 dashboard.tar 到 /opt 目录,master节点上传kubernetes-dashboard.yaml文件

 
cd /opt/
docker load -i dashboard.tar kubectl apply -f kubernetes-dashboard.yaml

方法二:

 
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0/aio/deploy/recommended.yaml

//查看所有容器运行状态

 
kubectl get pods -A

2、使用火狐或者360浏览器访问

 
https://node01:30001/
https://192.168.160.40:30001/ #使用Node1或者node2访问

//创建service account并绑定默认cluster-admin管理员集群角色

 
kubectl create serviceaccount dashboard-admin -n kube-system

kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin

//获取令牌密钥

 
kubectl describe secrets -n kube-system $(kubectl -n kube-system get secret | awk '/dashboard-admin/{print $1}')

三 、安装Harbor私有仓库

//修改主机名

 
hostnamectl set-hostname hub.mcl.com

 

//所有节点加上主机名映射

 
echo '192.168.160.70 hub.mcl.com' >> /etc/hosts

//安装 docker

 
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum install -y docker-ce docker-ce-cli containerd.io mkdir /etc/docker
cat > /etc/docker/daemon.json <<EOF### 下面命令也需要在master和node节点重新执行,因为之前没有指定harbor仓库地址
{
"registry-mirrors": ["https://6g3b0w0w.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"insecure-registries": ["https://hub.mcl.com"]
}
EOF systemctl start docker
systemctl enable docker

//所有 node 节点都修改 docker 配置文件,加上私有仓库配置

 
cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": ["https://6g3b0w0w.mirror.aliyuncs.com"],
"exec-opts": ["native.cgroupdriver=systemd"],
"log-driver": "json-file",
"log-opts": {
"max-size": "100m"
},
"insecure-registries": ["https://hub.mcl.com"]
}
EOF systemctl daemon-reload
systemctl restart docker


 
//安装 Harbor
//上传 harbor-offline-installer-v1.2.2.tgz 和 docker-compose 文件到 /opt 目录

 
cd /opt
cp docker-compose /usr/local/bin/
chmod +x /usr/local/bin/docker-compose tar zxvf harbor-offline-installer-v1.2.2.tgz
cd harbor/
vim harbor.cfg
5 hostname = hub.xkq.com
9 ui_url_protocol = https
24 ssl_cert = /data/cert/server.crt
25 ssl_cert_key = /data/cert/server.key
59 harbor_admin_password = Harbor12345


 
//生成证书

 
mkdir -p /data/cert
cd /data/cert  

#生成私钥

 
openssl genrsa -des3 -out server.key 2048

输入两遍密码:123456

#生成证书签名请求文件

 
openssl req -new -key server.key -out server.csr

输入私钥密码:123456
输入国家名:CN
输入省名:BJ
输入市名:BJ
输入组织名:LV
输入机构名:LV
输入域名:hub.ly.com
输入管理员邮箱:admin@ly.com
其它全部直接回车

#备份私钥

 
cp server.key server.key.org

#清除私钥密码

 
openssl rsa -in server.key.org -out server.key  

输入私钥密码:123456

#签名证书

 
openssl x509 -req -days 1000 -in server.csr -signkey server.key -out server.crt

chmod +x /data/cert/*

cd /opt/harbor/
./install.sh

浏览器访问:https://hub.xkq.com
用户名:admin
密码:Harbor12345

//在一个node节点上登录harbor

 
docker login -u admin -p Harbor12345 https://hub.mcl.com

//上传镜像

 
docker tag nginx:latest hub.mcl.com/library/nginx:v1
docker push hub.mcl.com/library/nginx:v1 #上传到harbor仓库

//在master节点上删除之前创建的nginx资源

 
kubectl delete deployment nginx

kubectl run nginx-deployment --image=hub.xkq.com/library/nginx:v1 --port=80 --replicas=3

kubectl expose deployment nginx-deployment --port=30000 --target-port=80
kubectl get svc,pods yum install ipvsadm -y
ipvsadm -Ln curl 10.96.222.161:30000 kubectl edit svc nginx-deployment
25 type: NodePort #把调度策略改成NodePort kubectl get svc


  

浏览器访问:

 
192.168.2.66:32122
192.168.2.200:32122
192.168.2.77:32122

四、 内核参数优化方案

 
cat > /etc/sysctl.d/kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
net.ipv4.ip_forward=1
net.ipv4.tcp_tw_recycle=0
vm.swappiness=0 #禁止使用 swap 空间,只有当系统内存不足(OOM)时才允许使用它
vm.overcommit_memory=1 #不检查物理内存是否够用
vm.panic_on_oom=0 #开启 OOM
fs.inotify.max_user_instances=8192
fs.inotify.max_user_watches=1048576
fs.file-max=52706963 #指定最大文件句柄数
fs.nr_open=52706963 #仅4.4以上版本支持
net.ipv6.conf.all.disable_ipv6=1
net.netfilter.nf_conntrack_max=2310720
EOF

kubeadm搭建k8s的更多相关文章

  1. kubeadm搭建K8s集群及Pod初体验

    基于Kubeadm 搭建K8s集群: 通过上一篇博客,我们已经基本了解了 k8s 的基本概念,也许你现在还是有些模糊,说真的我也是很模糊的.只有不断地操作去熟练,强化自己对他的认知,才能提升境界. 我 ...

  2. kubeadm 搭建 K8s

    kubeadm 搭建 K8s 本篇主要记录一下 使用 kubeadm 搭建 k8s 详细过程 ,环境使用 VirtualBox 构建的3台虚拟机 1.环境准备 操作系统:Centos7 (CentOS ...

  3. kubeadm 搭建 K8S集群

    kubeadm是K8s官方推荐的快速搭建K8s集群的方法. 环境: Ubuntu 16.04 1 安装docker Install Docker from Ubuntu’s repositories: ...

  4. CentOS7 使用 kubeadm 搭建 k8s 集群

    一 安装Docker-CE 前言 Docker 使用越来越多,安装也很简单,本次记录一下基本的步骤. Docker 目前支持 CentOS 7 及以后的版本,内核要求至少为 3.10. Docker ...

  5. centos7 kubeadm 搭建k8s

    Centos 7 搭建 kubernetes 集群环境 一.介绍 本次是centos7 搭建kubernetes1.15.9 通过kubeadm 的形式搭建 二.准备 > centos 7 (镜 ...

  6. 使用kubeadm搭建k8s集群

    1.初始化集群信息 这里我才用了两台虚拟机来搭建集群,一个master,一个node 角色 IP地址 组件 master 192.168.126.137 docker, kubectl, kubead ...

  7. 使用kubeadm搭建高可用k8s v1.16.3集群

    目录 1.部署环境说明 2.集群架构及部署准备工作 2.1.集群架构说明 2.2.修改hosts及hostname 2.3.其他准备 3.部署keepalived 3.1.安装 3.2.配置 3.3. ...

  8. 使用kubeadm方式搭建K8S集群

    使用kubeadm方式搭建K8S集群 kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具. 这个工具能通过两条指令完成一个kubernetes集群的部署: # 创建一个 Ma ...

  9. 使用Kubeadm搭建Kubernetes(1.12.2)集群

    Kubeadm是Kubernetes官方提供的用于快速安装Kubernetes集群的工具,伴随Kubernetes每个版本的发布都会同步更新,在2018年将进入GA状态,说明离生产环境中使用的距离越来 ...

  10. kubeadm安装k8s测试环境

    目标是搭建一个可测试的k8s环境,使用的工具 kubeadm, 最终一个master节点(非高可用),2个node节点. 环境以及版本 Centos7.3 kubeadm 1.11.1 kubelet ...

随机推荐

  1. servlet和spring框架的关系

    1.Servlet是什么? servlet就是一个Java接口,是JavaEE规范的一种,主要是为了扩展Java作为Web服务的功能. 由其他内部厂商如tomcat,JBoss内部实现web的功能. ...

  2. SpringBoot配置双数据源

    SpringBoot配置双数据源 一.搭建springboot项目 二.添加依赖 <dependencies> <!--web服务--> <dependency> ...

  3. vue组件之间的传参

    vue组件之间传参有三种传参方式'父传子','子传父','非父子组件之间传值' 父传子 父组件 <template> <CounterCom :num="5"&g ...

  4. 安装gitlab的总结

    安装过程参考文档 http://www.linuxe.cn/post-520.html https://www.bilibili.com/read/cv4602641 备注要点: 1.gitlab安装 ...

  5. Xpath 常用语法展示

    非标准代码处理 from lxml import etree #导入lxml 中erree模块 parser = etree.HTMLParser(encoding="utf-8" ...

  6. v4l2编程

    一.video 4 linux 2 ,是linux中关于视频设备的内核驱动.在linux中,视频设备是设备文件,可以像访问普通文件一样对其进行读写,摄像头在/dev/video 0下 二一般操作流程( ...

  7. Java方法之命令行传递参数

    命令行传参 有时候希望运行一个程序时候再传递给它消息.这要靠传递命令行参数给main()函数实现. public class Demo05 { public static void main(Stri ...

  8. ES语法(简)

    1.上编写到怎样安装部署elk,这篇记录怎样简单使用.以便于后期复习使用. 2.登录localhost:5601进入开发者模式. 3.初学担心没有数据可以自己PUT数据比较直观的学习语法.这里可以用网 ...

  9. js检测邮箱格式,正则检测邮箱格式

    网上搜了关于邮箱格式的检测,发现很多不太适用,我自己写了一个,可以检测有开头和没开头的,又可以检测@,@qq. 后的格式 var myReg=/^(\w|(\.\w+))+@([a-zA-Z0-9_- ...

  10. 梯度下降算法VS正规方程算法

    梯度下降算法的大家族: ①批量梯度下降:有N个样本,求梯度的时候就用了N个样本的梯度数据 优点:准确 缺点:速度慢 ②随机梯度下降:和批量梯度下降算法原理相似,区别在于求梯度时没有用所有的N歌样本数据 ...