一、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. NVIDIA的GPU算力Compute Capalibity

    可查看官方查询地址:https://developer.nvidia.com/cuda-gpus

  2. ES bool查询

    一.bool查询包含四种操作 1.must 2.must not 3.filter 4.should 二.功能 1.must 对应mysql的 and a= 2.must not 对应mysql的 a ...

  3. centos7 启动报错 Failed to mount /sysroot

    centos7 启动报错 Failed to mount /sysroot   场景: centos7系统异常关闭后,启动后进入不了图形化界面 解决方法: 1. 定位报错原因 进入单用户模式后执行下面 ...

  4. sublime json格式化

    1. 插件安装 install package-->pretty json 2. 快捷键设置 设置(preference):热键设置 [ {"keys": ["al ...

  5. 国际版Office365客户端配置

    Email Provider IMAP Settings POP Settings SMTP Settings Microsoft 365 Outlook Hotmail Live.com Serve ...

  6. Npoi.Mapper 日期转换

    问题:Excel文档里有一些列是日期类型的数据,使用Mapper默认的转换,发现生成的实体,在有的系统环境下能正常转换,但是在有的系统环境下,转换的日期出现中文. 猜想是Excel文档里,日期列的单元 ...

  7. (四)REDIS-布隆过滤器及缓存

    (一)布隆过滤器 布隆过滤器(英语,Bloom Filter)是1970年由布隆提出的.它实际是一个很长的二进制数组+多个随机Hash算法映射函数,主要用于判断一个元素是否在集合中. 通常我们会遇到很 ...

  8. ubuntu16.04下载地址

    ubuntu16.04下载地址: 中科大源 http://mirrors.ustc.edu.cn/ubuntu-releases/16.04/ 阿里云开源镜像站 http://mirrors.aliy ...

  9. Java课堂学习总结

    对于Java字段的初始化来说,共有以下几种方法: 1.类的构造函数(构造方法):当创建一个对象时,其构造函数就会自动调用.构造方法必须与类名相同,无返回值.如果程序员没有定义一个构造函数时,系统会自动 ...

  10. The `.update()` method does not support writable nestedfields by default. Write an explicit `.update()` method for serializer `...`, or set `read_only=True` on nested serializer fields.解决办法

    原因 Serializers中,外表的字段如source="group.title"不能进行写入操作 解决办法 将外表字段设置为read_only=True,此时可能有人就会问了: ...