摘要:介绍已经进入生产阶段,部署高可用性集群现在变得更加容易。 在此处部署高可用性集群并创建您选择的负载均衡器。 通过执行加入操作来验证部署的创建。 在部署中标记您的子网,以便入口控制器可以自动发现使用了哪些子网。
简介
kubeadm1.13 现已投入生产。 使用 kubeadm 部署高可用性集群要容易得多。 但如果部署在AWS上,则必须启用cloud-provider=aws才能深度集成iaas层的资源。 我主要使用AWS elb和ebs。 相关资料还比较匮乏。 一些现有文档可能已过时或不完整。 有很多文章只是demo级别,根本无法商业化。 部署过程既耗时又乏味。
组件版本及集群环境集群组件及版本
Kubernetes 1.13.1
Docker 18.06.0- ce
Etcd 3.2.24
Calico 3.4.0 网络
集群机器
主服务器:
172.31 .22.208
172.31.17.44
172.31.22.135
节点:
172.31.29.58
PS
etcd集群非容器部署、systemd守护
三台master主机配置ssh无密码登录
主机配置 防火墙
systemctl stopfirewalldsystemctldisablefirewalld
禁用selinux
# 将SELinux设置为宽容模式(有效禁用它)setenforce 0sed -i "s/^ SerinUX=enforcing$/SELINUX=permissive/" /etc/selinux/config
net.bridge.bridge-nf-call-ip6tables 和 net.bridge.bridge- 启用nf-call-iptables
cat < /etc/sysctl.d/k8s.confnet.bridge.bridge-nf-call- ip6tables = 1net. Bridge.bridge-nf-call-iptables = 1vm.swappiness=0EOFsysctl --system
禁用交换
swapoff -a
修改/etc/fstab文件并注释掉SWAP自动挂载,使用
free -m关闭
加载ipvs相关模块:b>
at > /etc/sysconfig/modules/ipvs.modules <<EOF#!/bin/bashmodprobe - - ip_vsmodprobe -- ip_vs_rrmodprobe -- ip_vs_wrrmodprobe - - ip_vs_shmodprobe -- nf_conntrack_ipv4EOFchmod 755 /etc/sysconfig/modules/ipvs.modules && bashconfig /etc/sys/modules/ipvs.modules && lsmod | grep -e ip_vs -e nf_conntrack_ipv4
上述脚本创建的 /etc/sysconfig/modules/ipvs.modules 文件可确保在重新启动节点后自动加载所需的模块。 使用lsmod。 使用 grep -e ip_vs -e nf_conntrack_ipv4 命令检查所需的内核模块是否正确加载。
接下来需要确保每个节点上都安装了ipset软件包:yum install ipset。 轻松查看 ipvs 代理规则的最佳方法是安装管理工具 ipvsadm yum install ipvsadm。
授予 IAM 权限
主策略
{ "version": "2012-10-17", "statement": [ { "效果": "允许", "操作": [ "自动扩展:DescribeAutoScalingGroups", "自动扩展:DescribeLaunchConfigurations", "自动扩展:DescribeTags", "ec2:DescribeInstances", "ec2:DescribeRegions", "ec2:DescribeRouteTables", "ec2 :DescribeSecurityGroups"、"ec2:DescribeSubnets"、"ec2:DescribeVolumes"、"ec2:CreateSecurityGroup"、"ec2:CreateTags"、"ec2:CreateVolum"e"、"ec2:ModifyInstanceAttribute"、"ec2:ModifyVolume"、"ec2:AttachVolume"、"ec2:AuthorizeSecurityGroupIngress"、"ec2:CreateRoute"、"ec2:DeleteRoute"、"ec2:DeleteSecurityGroup"、"ec2:DeleteVolume" 、“ec2:DetachVolume”、“ec2:RevokeSecurityGroupIngress”、“ec2:DescribeVpcs”、“elasticloadbalancing:AddTags”、“elasticloadbalancing:AttachLoadBalancerToSubnets”、“elasticloadbalancing:ApplySecurityGroupsToLoadBalancer”、“elasticloadbalancing:CreateLoadBalancer”、“BalancerPolicy”、“elasticloadbalancing: CreateLoadBalancerListeners ", "elasticloadbalancing:ConfigureHealthCheck", "elasticloadbalancing:DeleteLoadBalancer", "elasticloadbalancing:DeleteLoadBalancerListeners", "elasticloadbalancing:DescribeLoadBalancers", "elasticloadbalancing:DescribeLoadBalancerAttributes", "elasticloadbalancing:DetachLoadBalancerFromSubnets", "elasticloadbalancing:DeregisterInstancesFromLoadBalancer", "elasticloadbalancing:ModifyLoadBalancerAttributes"," elasticloadbalancing:SetLoadBalancerPoliciesForBackendServer", " elasticloadbalancing:AddTags" ", "elasticloadbalancing :CreateListener"、"elasticloadbalancing:CreateTargetGroup"、"elasticloadbalancing:DeleteListener"、"elasticloadbalancing:DeleteTargetGroup"、"elasticloadbalancing:DescribeListeners"、"elasticloadbalancing:DescribeLoadBalancerPolicies"、"elasticloadbalancing:DescribeTargetGroups"、"elasticloadbalancing:DescribeTargetHealth"、"elasticloadbalancing:ModifyListener"、"elasticloadbalancing:ModifyTargetGroup"、"elasticloadbalancing:RegisterTargets"、"elasticloadbalancing:SetLoadBalancerPoliciesOfListener"、"iam:CreateService LinkedR ole"、"kms: DescribeKey " ], "Resource": [ "*" ] }, ]}
节点策略
{ "Version": "2012-10-17", “声明”:[{“效果”:“允许”,“操作”:[“ec2:DescribeInstances”,“ec2:DescribeRegions”,“ecr:GetAuthorizationToken”,“ecr:BatchCheckLayerAvailability”,“ecr:GetDownloadUrlForLayer", "ecr:GetRepositoryPolicy", "ecr:DescribeRepositories", "ecr:ListImages", "ecr:BatchGetImage", "sts:AssumeRole" ], "资源": "*" } ] }
标记标签
您必须按如下所示标记您的 ec2 实例、路由表、子网和安全组:
kubernetes.io/cluster/ = "owned"
集群-名称命名约定:
k8s-{region}-{env}-{num}
示例:
k8s-usa-west-2-test-1
安装 docker 和 kubeadm 安装指定版本的 docker安装 docker
yum install docker-18.06.1ce-5.amzn2 -ysystemctlenable docker
更改 docker Root Dir 目录
将/var/lib/dokcer配置为/data/docker,并确保/data为额外挂载的数据盘。
修改“/etc/sysconfig/docker”文件。
选项 ="--default-ulimit nofile=1024:4096 -g /data/docker"
修改/etc/docker/daemon.json:
cat > /etc/docker/daemon.json <<EOF{ "data-root": "/data/docker"}EOF
验证
[root@ip - 172-31-22-208 ~]# ls -lrt /var/lib/docker 总使用量 0[root@ip-172-31-22 -208 ~]# ls -lrt /data/docker/total use 0drwx------ 3 root root 20 Dec 11 10:44containerddrwx[ k4][k4 ] [ k4]--- 2根根 6 Dec 11 10:44 tmpdrwx------ 2根根 6 Dec 11 10:44 tmpdrwx[ k4]----- 4 根 根 32 Dec 11 10:44 pluginsdrwx---[k4 ]-- 2 根 根 6 Dec 11 10:44 容器 drwx------ 2 root root 25 Dec 11 10:44 卷 drwx---[ k4]- [ k4] 3 根 根 22 十二月 11 10:44 imagedrwx------ 2 根 6 12 月 11 日 10:44 trustdrwxr-x--- 3 根 根 19 12 月 11 10:44 networkdrwx[k4 ][ k4] ---- 3 根 40 12 月 11 日 10:44 override2drwx------ 2 根 6 12 月 11 日 10:44 swarmdrwx ------ 2 根 24 12 月 11 日 10:44 builderdrwx---- -[k4 ] 4 根 92 12月11日10:44 buildkit
重启docker服务
systemctl start docker
docker检查:
root @ip- 172 -31-22-208 ~]# docker infoContainers: 0 运行: 0 暂停: 0 停止: 0 映像: 0 服务器版本: 18.06.1-ce 存储驱动程序: override2 支持文件系统: xfs d_type 支持:true 本机覆盖差异:trueLogging 驱动程序:json-fileCgroup 驱动程序:cgroupfsPlugins:卷:本地网络:桥接主机 macvlan 空覆盖日志:awslogs Fluentd gcplogs gelfjournald json-文件日志项 splunk syslogSwarm:inactiveRuntimes:runcDefault 运行时:runcInit 二进制文件:docker-initcontainerd 版本:468a545b9edcd5932818eb9de8e72413e616e86erunc 版本:69663f0bd4b60 d f0 9991c08812a60108003fa340init 版本:fec3683 安全选项:seccomp 配置文件:default内核版本:4.14.70[k4 ] 72.55 .amzn2.x86_64操作系统:Amazon Linux 2OS 类型:linux 架构:x86_64CPU:4总内存:15.67GiB名称:ip-172-31-22-208.us-west - 2.计算。 InternalID: CG7S:P5XD:FLU6:MULI:2TSI:OLRY:A6EX:SM3D:FXNB:CMEQ:MU6R:XSCWDocker 根目录: /data/docker调试模式 (客户端): false调试模式 (服务器): false注册表: https://index .docker.io/v1/Labels:实验性: false不安全注册表: 127.0.0.0/8Live Restore Enabled: false
安装kubeadm等添加k8s仓库
cat < /etc/yum.repos.d/kubernetes.repo[kubernetes]name=Kubernetesbaseurl=https://package 。 Cloud.google.com/yum/repos/kubernetes-el7-x86_64enabled=1gpgcheck=1repo_gpgcheck=0gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https ://packages.cloud.google.com/yum/doc/rpm-package-key.gpgexinclude=kube*EOF
安装 kubeadm、kubelet、kubectl
yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetessystemctl 启用 kubelet && systemctl start kubelet
检查 kubeadm 版本
[ root@ip-172[ k4]31-22-208 ~]# kubeadm 版本kubeadm 版本: &version.Info{Major:"1", Minor:"13", GitVersion:"v1.13.0", GitCommit:"ddf47ac13c1a9483ea035a79cd7c10005ff21a6d", GitTreeState: “干净”,构建日期:“2018-12-03T21:02:01Z", GoVersion:"go1.11.2", Compiler:"gc", Platform:"linux/amd64"}
更新 kubelet 配置
节点预留资源配置并且支持cloud-provider,您必须首先对您的kubelet配置进行相应的更改,并将KUBELET_EXTRA_ARGS添加到/etc/sysconfig/kubelet
KUBELET_EXTRA_ARGS=[ k4]-cloud [k4 ]provider=aws
预留资源
配置cgroup
mkdir -p /sys/fs/cgroup /cpu/system.slice/kubelet .servicemkdir -p /sys/fs/cgroup/cpuacct/system.slice/kubelet.servicemkdir -p /sys/fs/cgroup/cpuset/system.slice/kubelet.servicemkdir -p /sys/fs / cgroup/内存/系统.slice/kubelet.servicemkdir -p /sys/fs/cgroup/devices/system.slice/kubelet.servicemkdir -p /sys/fs/cgroup /blkio/system.slice/kubelet .servicemkdir -p /sys/fs/cgroup/hugetlb/system.slice/kubelet.servicemkdir -p /sys/fs/cgroup/systemd/system.slice/kubelet.sservice
将以下内容添加到 /var/lib/kubelet/config.yaml:
enforceNodeAllocatable:- pods- kube-reserved- system [k4 ] ]reservedkubeReservedCgroup: /system.slice/kubelet.servicesystemReservedCgroup: /system.slicesystemReserved: cpu: 500m 内存: 1Gi 临时-存储: 5GikubeReserved: cpu: 500m 内存: 1Gi 临时-存储: 5Gi
部署高可用的etcd集群
Kubernetes系统使用etcd来存储所有数据。 本文档提供了部署 3 节点高可用 etcd 集群的步骤。 这三个节点复用了 kubernetes master 机器,分别是 etcd-host0、etcd-host1 和 etcd-host2被命名。
infra0: 172.31.22.208
infra1: 172.31.17.44
infra2: 172.31.22.135
使用的变量
本文档中使用的变量定义如下。
export NODE_NAME=infra0 # 当前部署的机器名称(任意定义,只要能区分不同机器即可) export NODE_IP=172.31 .22.208 # 导出当前部署的机器IP NODE_IPS ="172.31.22.208 172.31 .17.44 172.31 .二十二.135" # 集群中所有机器的etcd IP # 用于集群间通信的etcd IP和端口 export ETCD_NODES=infra0=https://172.31.22.208:2380,infra1=https://172.31.17.44:2380, infra2 =https:// /172.31.22.135:2380
export NODE_NAME=infra1 # 当前部署的机器名称(任意定义,只要能区分不同机器即可) export NODE_IP=172.31 # 17.44.导出当前部署的机器IP NODE_IPS=" 172.31.22.208 172.31.17.44 172.31.22.135" # etcd集群中所有机器IP # 导出etcd集群间通信的IP和端口 ETCD_NODES=infra0=https //172.31.22.208: 2380,infra1 =https://172.31.17.44: 2380,infra2=https://172.31.22.135:2380
export NODE_NAME=infra2 # 当前部署的机器导出 NODE_IP=172.31.22.135 # 当前部署的机器导出的IP NODE_IPS="172.31.22.208 172.31.17.44 172.31.22.135" # 集群中所有机器的 etcd IP # 用于互连的 etcd IP 和端口 集群通信导出 ETCD_NODES=infra0=https://172.31.22.208:2380,infra1=https: //172.31.17.44:2380,infra2=https://172.31.22.135:2380
下载前往二进制文件
https://github.com/coreos/etcd/releases页面下载最新版本的二进制文件。
wget https://github.com/coreos/etcd/releases/download/v3.2.24/etcd-v3.2.24-linux-amd64.tar.gztar - xvf etcd-v3。 2.24-linux -amd64.tar.gzmv etcd-v3.2.24-linux-amd64/etcd* 使用 /usr/bin 的密钥和证书
kubeadm 创建 kubeadm配置文件
使用以下脚本为将运行 etcd 成员的每个主机生成 kubeadm 配置文件。
# 使用主机 IP 或可解析名称更新 HOST0、HOST1、HOST2 sexport HOST0=172.31.22.208export HOST1=172.31.17.44export HOST2=172.31.22.135# 临时保存文件创建目录。 最终它将是另一个主机。 mkdir -p /tmp/${HOST0}/ /tmp/${HOST1}/ /tmp/${HOST2}/ETCDHOSTS=(${HOST0} ${HOST1} ${HOST2} )NAMES=("infra0 " "infra1" "infra2")for i in "${!ETCDHOSTS[@]}"; doHOST=${ETCDHOSTS[$i]}NAME=${NAMES[$i]}cat < /tmp/${HOST}/kubeadmcfg.yamlapiVersion:“kubeadm.k8s.io/v1beta1”种类:ClusterConfigurationetcd:本地:serverCertSANs:-“$ {HOST}"peerCertSANs: - "${HOST}" extraArgs:initial-cluster:infra0=https://${ETCDHOSTS[0]}:2380,infra1=https://${ETCDHOSTS[1 ] ]}:2380,infra2=https://${ETCDHOSTS[2]}:2380 初始 - 集群- 状态: 新名称:${NAME} 监听 -peer-url: https: //${HOST}:2380 监听-client-urls:https://${HOST}:2379advertise-client-urls:https://${HOST}:2379initial[k4 ] Advertising-peer-urls: https://${HOST}:2380EOFdone
生成证书颁发机构
运行以下命令:
kubeadm init Phase certs etcd-ca
生成以下两个文件:
/etc/kubernetes/pki/etcd/ca.crt
/etc/kubernetes/pki/etcd/ca.key
为每个成员创建证书
kubeadm初始化阶段证书etcd-server --config=/tmp/${HOST2}/kubeadmcfg.yamlkubeadm初始化阶段证书etcd-peer -[ k4]config=/tmp/ $ {HOST2}/kubeadmcfg.yamlkubeadm 初始阶段证书 etcd-healthcheck-client --config=/tmp/${HOST2}/kubeadmcfg.yamlkubeadm 初始阶段证书 Book apiserver-etcd[k4 ] Client --config=/tmp/${HOST2}/kubeadmcfg.yamlcp -R /etc/kubernetes/pki /tmp/${HOST2}/# 非-清理可重用证书查找/etc/kubernetes/pki -not -name ca.crt -not -name ca.key -type f -deletekubeadm init 阶段证书 etcd-server -[k4 ]config=/ tmp /${HOST1}/kubeadmcfg.yamlkubeadm 初始阶段证书 etcd-peer --config=/tmp/${HOST1} /kubeadmcfg.yamlkubeadm 初始化阶段证书 etcd-healthcheck-client --config=/tmp/${HOST1}/kubeadmcfg.yamlkubeadm 初始化阶段证书 apiserver-etcd-client -[ k4] config=/tmp/${HOST1}/kubeadmcfg.yamlcp -R /etc/kubernetes/pki /tmp/${HOST1}/find /etc/kubernetes/pki - 不是 -name crt [ k4]not -name ca.key -type f -deletekubeadm init 阶段证书 etcd-server --config=/tmp/${HOST0}/kubeadmcfg.yamlkubeadm init 阶段证书 etcd -对等点 --config=/tmp/${HOST0}/kubeadmcfg.yamlkubeadm 初始阶段证书 etcd-healthcheck-Client --config=/tmp /${HOST0} /kubeadmcfg.yamlkubeadm init Phase certs apiserver-etcd-client --config=/tmp/${HOST0}/kubeadmcfg.yaml# 证书用于清理 HOST0# 无需移动证书,不应从此处复制。hostfind /tmp/${HOST2} -name ca.key -type f -deletefind /tmp/${HOST1} -name ca.key -type f -delete
将证书复制到相应主机
USER=rootCONTROL_PLANE_IPS="172.31.17.44 172.31.22.135"for ${CONTROL_PLANE_IPS} 中的主机; do scp -r /tmp/ ${host }/pki "${USER}"@$host:done
$ 例如,HOST0 所需的文件的完整列表为:
/etc/kubernetes/pki§── apiserver -etcd-client.crt §── apiserver-etcd-client.key └── etcd §── ca. crt §── ─ ca.key §── healthcheck-client.crt── 何时 healthcheck-client.key── Peer.crt §── Peer.Key §── Server.crt └─ ─ Server.Key
其他两台主机同上。
为etcd创建systemd单元文件
mkdir -p /var/lib/etcd # 必须先创建工作目录cat > etcd.service <<EOF[Unit] 描述= Etcd ServerAfter=network.targetAfter=network-online.targetWants=network-online.targetDocumentation=https://github.com/coreos[Service]Type=notifyWorkingDirectory=/var/lib/etcd/ExecStart=/usr/bin/etcd --name=${NODE_NAME} [ k4]-cert-file=/etc/kubernetes/pki/etcd/server.crt --key-file=/etc/kubernetes/pki/etcd/server.key - -peer-cert-file=/etc/kubernetes/pki/etcd/peer.crt --peer-key-file=/etc/kubernetes/pki/etcd/ peer.key --trusted-ca-file=/etc/kubernetes/pki/etcd/ca.crt --peer-trusted-ca-file =/etc/kubernetes/pki/etcd/ca.crt --initial-advertise-peer-urls=https://${NODE_IP}:2380 --listen -对等点-urls=https://${NODE_IP}:2380 --监听-客户端-urls=https://${NODE_IP}:2379,http:// 127.0.0.1:2379 --广告-客户端-urls=https://${NODE_IP}:2379 --初始-集群-令牌=etcd-集群-0 --初始-集群=${ETCD_NODES} -[k4 ]initial-cluster-state=new --data-dir=/var/lib/etcd--auto-compaction-retention=“1”[ k4]-quota-backend-bytes="8589934592"Restart=on-failureRestartSec=5LimitNOFILE=65536[Install]WantedBy=multi-user.targetEOF
规范etcd的工作目录和数据目录是/var/lib/etcd。 该目录必须在启动服务之前创建。
为了保证通信安全,必须指定etcd的公钥和私钥(cert-file和key-file)。 对等通信公钥和私钥以及 CA 证书(peer-cert-file、peer-key-file、peer-trusted-ca-file)、客户端 CA 证书(受信任-ca-file);
--initial-cluster -state值为new的情况下,--name的参数值放在列表--initial-cluster中是有需要的。
启动etcd服务
mv etcd.service /etc/systemd/system/systemctl daemon-reloadsystemctl enable etcdsystemctl start etcdsystemctl status etcd$
最初启动的etcd进程停止一段时间,其他节点上的etcd进程我将等待。 加入集群。 是正常现象。
在所有etcd节点上重复上述步骤,直到所有机器上的etcd服务启动。
验证服务
部署etcd集群后,在任意etcd集群节点上运行以下命令。
对于 ${NODE_IPS} 中的 ip;执行 ETCDCTL_API= 3 /usr/bin/etcdctl --endpoints=https://${ip}:2379 --cacert =/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/ server.key端点健康;已完成
预期结果:
https://172.31.22.208:2379健康:成功提交提案:take = 1.543275mshttps://172.31.17.44 :2379 是 OK: 成功提交提案提交: Get = 1.883033mshttps://172.31.22.135:2379 是 OK: 成功完成提交建议:take = 2.026367ms
如果三个etcd输出全部健康,则说明集群服务健康(忽略警告信息)。
部署高可用的主集群为kube-apiserver创建TCP负载均衡
这里我们为Masu选择nlb。 具体的创作过程我就不再解释了。
结果创建 nlb-sgt-k8sapiserver-test-4748f2f556591bb7.elb.us-west-2.amazonaws.com。
添加到变量
导出 LOAD_BALANCER_DNS=nlb-sgt-k8sapiserver-test-4748f2f556591bb7.elb.us-west-2。 amazonaws.comexport ETCD_0_IP=172.31.22.208export ETCD_1_IP=172.31.17.44export ETCD_2_IP=172.31.22.135
创建并启用 AWS 云 - 提供程序
cat > kubeadm -config 。 yaml <<EOFapiVersion:kubeproxy.config.k8s.io/v1alpha1kind:KubeProxyConfigurationmode:“ipvs”---apiVersion:kubeadm.k8s.io/v1beta1kind:ClusterConfigurationkubernetesVersion:steadycontrolPlaneEndpoint:“$ {LOAD_BALANCER_DNS}:6443"api 服务器: extraArgs: cloud-provider: aws certSANs: - "${LOAD_BALANCER_DNS}"控制器管理器: extraArgs: cloud-provider: awsetcd: external: 端点: - https: / /$ {ETCD_0_IP}:2379 - https://${ETCD_1_IP}:2379 - https://${ETCD_2_IP}:2379 caFile: /etc/kubernetes/pki/etcd/ca.crt certFile: / etc/ kubernetes/pki/apiserver-etcd-client.crt keyFile: /etc/kubernetes/pki/apiserver-etcd-client.keynetworking: podSubnet: "192.168.0.0/16"clusterName: " k8s[ k4]us-west-test-1"EOF
在未启用 AWS Cloud-provider 的情况下创建
cat > kubeadm[ k4]config。 yaml < <EOFapiVersion:kubeadm.k8s.io/v1beta1kind:ClusterConfigurationkubernetesVersion:steadycontrolPlaneEndpoint:“$ {LOAD_BALANCER_DNS}:6443”apiServer:certSAN: - "${LOAD_BALANCER_DNS}" etcd: 外部: 端点: - https://${ETCD_0_IP}:2379 - https://${ETCD_1_IP}:2379 - https:// ${ETCD_2_IP}:2379 caFile: /etc/kubernetes/pki/etcd/ca.crt certFile: /etc/kubernetes/pki/apiserver-etcd-client.crt keyFile: /etc/kubernetes/pki/ apiserver -etcd-client.keynetworking: podSubnet: "192.168.0.0/16" clusterName: "k8s-us-west-test-1"EOF
创建第一个 master
运行
kubeadm init --config=kubeadm-config.yaml
它应该如下所示:
配置访问证书:
mkdir -p $HOME/.kubecp -i /etc/kubernetes/admin.conf $HOME/.kube/ configchown $(id -u ):$(id -g) $HOME/.kube/config
创建剩余的 master
复制证书
USER=root #customizedCONTROL_PLANE_IPS =“172.31.17。44 172.31.22.135" 对于 ${CONTROL_PLANE_IPS} 中的主机;执行 scp /etc/kubernetes/pki/ca.crt "${USER}"@$host: scp /etc/kubernetes/pki/ca.key "${USER “ }”@$host:scp /etc/kubernetes/pki/sa.key “${USER}”@$host:scp /etc/kubernetes/pki/sa.pub “${USER}”@$host:scp /etc/kubernetes/pki/front-proxy-ca.crt "${USER}"@$host: scp /etc/kubernetes/pki/front-proxy-ca.key "${ USER} }" }"@$host: scp /etc/kubernetes/admin.conf "${USER}"@$host:done
在剩余主机上运行:
USER = root #customizedmv /${USER}/ca.crt /etc/kubernetes/pki/mv /${USER}/ca.key /etc/kubernetes/pki/mv /${USER}/sa.pub /etc/ kubernetes /pki/ mv /${USER}/sa.key /etc/kubernetes/pki/mv /${USER}/front-proxy-ca.crt /etc/kubernetes/pki/mv /${ USER}/front -proxy-ca.key /etc/kubernetes/pki/mv /${USER}/admin.conf /etc/kubernetes/admin.conf
加入控制节点:
kubeadm join nlb-sgt-k8sapiserver-test-4748f2f556591bb7.elb.us[ k4]西 -2.amazonaws.com:6443 --令牌 u9hmb3.gwfozvsz90k3yt9g --发现-令牌-ca-cert-哈希 sha256:24c354cce46de9c1eb1a8358b9ba064166e87cf 6c 011fecaae3350c3910c215a [ k4] ][ k4]实验-控制-平面
发现-令牌-ca-证书-哈希
openssl x509 [ k4]pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 - sed "s /^.* //"
部署 calico 网络aws ec2
检查 src/dst 检查是否已关闭 是否要确认?
配置calicoctl下载calicoctl
curl -O -L https://github.com/projectcalico /calicoctl/releases/download/ v3.4.0 /calicoctlchmod +x calicoctlmv calicoctl /usr/bin/
Calico 配置文件设置
cat > /etc/calico/calicoctl.cfg <<EOFapiVersion:projectcalico.org/v3kind:CalicoAPIConfigmetadata:spec:etcdEndpoints : https://${ETCD_0_IP}:2379、https://${ETCD_1_IP}:2379、https://${ETCD_2_IP}:2379 etcdKeyFile: /etc/kubernetes/pki/etcd/server.key etcdCertFile: /etc /kubernetes/pki/etcd/server.crt etcdCACertFile: /etc/kubernetes/pki/etcd/ca.crtEOF
使用的变量
export ETCD_KEY=$(cat / etc /kubernetes /pki/etcd/server.key | tr -d "")export ETCD_CERT=$(cat /etc/kubernetes/pki/etcd/server.crt | base64 | tr -d "") 导出 ETCD_CA =$ (cat /etc/kubernetes/pki/etcd/ca.crt |base64 | tr -d "")
创建 calico.yml
cat > calico .yml << EOF# Calico 版本 v3.4.0# https://docs.projectcalico.org/v3.4/releases#v3.4.0# 这个 manifest 包含以下组件版本: # calico/node:v3.4.0# calico/cni:v3.4.0# calico/kube-controllers:v3.4.0# 此 ConfigMap 用于配置自托管 Calico 安装。 .kind: ConfigMapapiVersion: v1metadata: name: calico-config namespace: kube-systemdata: # 使用 etcd 集群位置进行配置。 etcd_endpoints: "https://${ETCD_0_IP}:2379,https://${ETCD_1_IP}:2379,https://${ETCD_2_IP}:2379" # 如果您使用启用了 TLS 的 etcd,请取消注释以下内容: # 同时设置etcd_ca: "/calico-secrets/etcd-ca" etcd_cert: "/calico-secrets/etcd-cert" etcd_key: "/calico- in the following Secrets ]secrets/ etcd-key" # 配置要使用的 Calico 后端。 calico_backend: "bird" # 设置要使用的 MTUveth_mtu: "1440" # 要在每个节点上安装的 CNI 网络配置。 此配置中任何特殊的 # 值都会自动填充。 cni_network_config: |- { "name": "k8s-pod-network" , "cniVersion": "0.3.0", "plugins": [ { "type": "calico", "log_level" :“信息”,“TCD_ENDPOINTS”:“__etcd_ENDPOINTS __”,“etcd_key_file”:“__etcd_key_file___________________etcd_cert _File__”,“etcd_ca_cert_file”:“__etcd_ca_cert_file__”,“mtu”:__cni_mtu__,“ipam”:{“类型”:“calico[k4” ]ipam" }, "policy": { "type": "k8s " }, "kubernetes": { "kubeconfig": "__KUBECONFIG_FILEPATH__" } }, {"type": "portmap", "snat": true, "capability": {"portMappings": true} } ] }---# 以下内容与启用了 TLS 的 etcd 一起使用。 Secret cluster.# 配置 Secrets,请参见 http://kubernetes.io/docs/user-guide/secrets/apiVersion: v1kind: Secrettype: Opaquemetadata: name: calico-etcd[ k4]secrets namespace: See kube 。 -systemdata: # 如果需要,请在下面输入 etcd TLS 设置,或者 # 如果您不想为 etcd 使用 TLS,则保留空白。 # 您必须取消注释下面的键,并用 # 将与 TLS 数据关联的每个文件的 Base64 编码内容填充值。 # 编码文件内容的示例命令: cat | Base64 -w 0 etcd-key: ${ETCD_KEY} etcd-cert: ${ETCD_CERT} etcd-ca: ${ETCD_CA}---# 除了 calico/node 容器之外,此清单还 # 配置每个主节点和工作节点的 Calico CNI 插件和网络配置。安装上。 Kubernetes 集群类型:DaemonSetapiVersion:extensions/v1beta1metadata:名称:calico-node 命名空间:kube-系统标签:k8s-app:calico-nodespec:选择器:matchLabels:k8s-app:calico[ k4]node updateStrategy: type: RollingUpdate RollingUpdate: maxUnavailable: 1 template:metadata:labels: k8s-app: calico-node comments: # 这与下面的 CriticalAddonsOnly 限额一起, # 使 pod 成为关键 Addon [k4 ]。 # 获得优先调度并保证资源提前预留。r 被踢出。 Scheduler.alpha.kubernetes.io/ritic-pod: "" spec:nodeSelector:beta.kubernetes.io/os:linux hostNetwork:true tolerations: # calico-node 在所有节点上进行调度 检查。 - Effects: NoSchedule Operator: Present # 将 pod 标记为重新调度的关键 -。 - 键:CriticalAddonsOnly 操作员:存在 - 效果:NoExecute 操作员:存在 serviceAccountName:calico- 节点 # 最大限度地减少滚动升级或删除期间的停机时间。 告诉 Kubernetes “强制 # 删除”: https://kubernetes.io/docs/concepts/workloads/pods/pod/#termination-of-pods .terminationGracePeriodSeconds: 0 initContainers: # 这个容器停止每个节点上的 Calico CNI 二进制文件 # 和 CNI 网络配置文件。 - name: install-cni image: quay.io/calico/cni:v3.4.0 command: ["/install-cni.sh "] env: # 要创建的 CNI 配置文件的名称。 - 名称:CNI_CONF_NAME 值:“10-calico.conflist” # 要在每个节点上安装的 CNI 网络配置。 - name: CNI_NETWORK_CONFIG valueFrom: configMapKeyRef: name: calico-config key: cni_network_config # Calico etcd 集群位置。 - 名称:ETCD_ENDPOINTS valueFrom:configMapKeyRef:名称:calico-config 密钥:etcd_endPoints # CNI MTU 配置变量 - name: CNI_MTU valueFrom: configMapKeyRef: name: calico-config key: veth_mtu # 防止容器永远休眠。 - 名称:SLEEP 值:“false”volumeMounts:- 挂载路径:/host/opt/cni/bin 名称:cni-bin-dir - 挂载路径:/host/etc/cni /net .d name: cni-net-dir - mountPath: /calico-secrets name: etcd-certs Containers: # 在每个 Kubernetes 节点上运行 calico/node 容器。 # 这个容器对每台主机上的网络策略和路由进行编程。 -名称:calico-节点图像:quay.io/calico/node:v3.4.0 env: # Calico etcd 集群的位置。 - name: ETCD_ENDPOINTS valueFrom: configMapKeyRef: name: calico-config key: etcd_endpoints # etcd 的 CA 证书的位置。 [ k4] name: ETCD_CA_CERT_FILE valueFrom: configMapKeyRef: name: calico-config key: etcd_ca # etcd 客户端密钥的位置。 - name: ETCD_KEY_FILE valueFrom: configMapKeyRef: name: calico-config key: etcd_key # etcd 客户端证书的位置。 -名称:ETCD_CERT_FILEvalueFrom: configMapKeyRef: name: calico-config key: etcd_cert # 设置节点控制器的noderef。 - name: CALICO_K8S_NODE_REF valueFrom: fieldRef: fieldPath: spec.nodeName # 选择要使用的后端。 - name: CALICO_NETWORKING_BACKEND valueFrom : configMapKeyRef: name: calico-config key: calico_backend # 用于标识部署类型的集群类型 - name: CLUSTER_TYPE value: "k8s,bgp" # 自动检测 BGP IP 地址。 - 名称:IP 值:“自动检测”# 启用 IPIP - 名称:CALICO_IPV4POOL_IPIP value: "Always" # 设置启用 ipip 时使用的隧道设备 MTU - name: FELIX_IPINIPMTU valueFrom: configMapKeyRef: name: calico-config key: veth_mtu # 如果不存在则触发默认 IPv4 池创建时间。 # Pod IP 将从该范围中选择。 安装后更改此值没有任何效果。 这必须适合 --cluster-cidr。 - 名称:CALICO_IPV4POOL_CIDR 值:“192.168.0.0/ 16” # 禁用文件日志记录,以便“kubectl 日志”正常工作。 - 名称:CALICO_DISABLE_FILE_LOGGING 值:“true” # 将托管 Felix 端点的默认操作设置为接受。- 名称:FELIX_DEFAULTENDPOINTTOHOSTACTION 值:“ACCEPT” # 在 Kubernetes 中禁用 IPv6。 - 名称:FELIX_IPV6SUPPORT 值:“false” # 将 Felix 日志设置为“info”。 - 名称:FELIX_LOGSEVERITYSCREEN 值:“info” - 名称:FELIX_HEALTHENABLED 值:“true” securityContext:权限:true 资源:请求:cpu:250m livenessProbe:httpGet:路径:/liveness 端口:9099 主机:localhost periodSeconds: 10InitialDelaySeconds: 10 FailureThreshold: 6 readinessProbe: exec: 命令: [ k4]/bin/calico-node - -bird-ready - -felix-ready periodSeconds: 10 卷装载: - mountPath: /lib/modules 名称: lib-modules readOnly : true - 挂载路径:/run/xtables.lock 名称:xtables-lock readOnly: false - 挂载路径:/var/run/calico 名称:var-run-calico readOnly: false - ] 挂载路径:/var/lib/calico 名称:var-lib-calico readOnly: false - 挂载路径:/calico-secrets 名称:etcd-certs 卷:# calico由 /node 使用。 - 名称:lib-modules 主机路径: 路径:/lib/modules - 名称:var-run-calico 主机路径: 路径:/var/run/calico - 名称:var-lib-calico 主机路径:路径:/var/lib/calico - 名称: xtables[ k4]lock hostPath: path: /run/xtables.lock type: FileOrCreate # 用于 CNI 安装。 - 名称:cni-bin-dir 主机路径: 路径:/opt/cni/bin - 名称:cni-net-dir 主机路径: 路径:/etc/cni/net .d # 使用模式 400 挂载 etcd TLS 密钥。 # 请参阅 https://kubernetes.io/docs/concepts/configuration/secret / - name: etcd-certs Secret: SecretName: calico-etcd-。 ]秘密默认模式:0400---api版本:v1kind:ServiceAccount元数据:名称:calico-node 命名空间: kube-system---# 此清单部署 Calico Kubernetes 控制器。 # 请参阅 https://github.com/projectcalico/kube-controllersapiVersion:extensions/。 v1beta1kind:部署元数据:名称:calico-kube-controllers 命名空间:kube-系统标签:k8s-app:calico-kube-controllers 注释:Scheduler.alpha.kubernetes。 Critical -pod: ""spec: # 一个控制器只能有一个活动实例。 副本:1 策略:类型:重新创建模板:元数据:名称:calico-kube-controllers 命名空间:kube-system 标签:k8s-app:calico-kube-controllers 规范:nodeSelector : beta.kubernetes.io/os: linux # 控制器必须运行在主机网络命名空间中,所以# 不受阻止其工作的政策的约束。 hostNetwork: true tolerations: # 将 pod 标记为关键添加 - 以进行重新调度。 - 键:CriticalAddonsOnly 操作员:存在 - 键:Node-role.kubernetes.io/Master 效果:NoSchedule 服务帐户名称:calico-kube- 控制器容器:- 名称:calico[ k4]kube- 控制器镜像:quay.io/calico/kube -controllers:v3.4.0 env: # Calico etcd 集群位置 - name: ETCD_ENDPOINTS valueFrom: configMapKeyRef: name: calico[k4 ]config key: etcd_endpoints # etcd 的 CA 证书的位置。- name: ETCD_CA_CERT_FILE valueFrom: configMapKeyRef: name: calico-config key: etcd_ca # etcd 客户端密钥的位置。 - name: ETCD_KEY_FILE valueFrom: configMapKeyRef: name: calico-config key: etcd_key # etcd 客户端证书的位置。 - name: ETCD_CERT_FILE valueFrom: configMapKeyRef: name: calico-config key: etcd_cert # 选择要运行的控制器。 - 名称:ENABLED_CONTROLLERS 值:策略、命名空间、服务帐户、工作负载端点、节点 volumeMounts: # 挂载位置etcd TLS 秘密。 - mountPath: /calico-secrets name: etcd-certs readinessProbe: exec: command: - /usr/bin/check-status - -r volume : # 挂载到 etcd模式 400 的 TLS 机密。 # 请参阅 https://kubernetes.io/docs/concepts/configuration/secret/。 - 名称:etcd-certs 秘密:secretName:calico-etcd[ k4]secrets defaultMode:0400---apiVersion:v1kind:ServiceAccountmetadata:名称:calico-kube[k4 ]controllers 命名空间:kube-system---# 包含 kube -controllers 组件的集群角色, # 创建它并调用它 calico-kube-controllers serviceaccount。种类:ClusterRoleapiVersion:rbac.authoriza。tion.k8s.io/v1beta1metadata: name: calico-kube-controllersrules: # 监视 Pod 的标签更改。 # 节点控制器监控 Kubernetes 节点。 # 策略中使用命名空间和服务帐户标签。 - apiGroups : - "" 资源: - Pods - 节点 - 命名空间 - serviceaccounts 动词: - watch - list # 监视 Kubernetes NetworkPolicies 的更改。 - apiGroups:-networking.k8s.io 资源:-networkpolicies 动词:-watch-list---kind:ClusterRoleBindingapiVersion:rbac.authorization.k8s.io/ v1beta1元数据:名称:calico-kube-controllersroleRef:api组:rbac.authorization.k8s.io类型:集群角色名称:calico-kube-controllerssubjects:- kind: ServiceAccount name: calico-kube-controllers namespace: kube-system---# Include cluster role for calico-node DaemonSet, # 并绑定它到 calico- 节点。 serviceaccount.kind: ClusterRoleapiVersion: rbac.authorization.k8s.io/v1beta1metadata: name: calico-noderules: # CNI 插件必须检索 pod、节点和命名空间。 - apiGroups:[""] 资源:- Pod - 节点 - 命名空间动词:- get - apiGroups:[""] 资源:- 端点 - 服务动词: # 用于发现广告的服务IP。 - watch - list - apiGroups: [""] Resources: - Node/Status Verbs: # 需要清除 NodeNetworkUnavailable 标志。 - 补丁 ---api版本:rbac.authorization.k8s.io/v1beta1kind:ClusterRoleBinding元数据:名称:calico-noderoleRef:apiGroup:rbac.authorization.k8s.io种类:ClusterRole名称:calico-nodesubjects:-类型:服务帐户名称:calico- 节点命名空间:kube-system---EOF
部署 calico
kubectl apply - f calico .yml
设置 ippool
运行:
calicoctl apply -f - << EOFapiVersion: projectcalico.org/v3kind: IPPoolmetadata : 名称: default-ipv4-ippoolspec: cidr: 192.168.0.0/16 ipipMode: CrossSubnet natOutcoming: trueEOF
部署节点节点
主机配置的全部执行该项目。
执行join操作:
kubeadm join nlb-sgt-k8sapiserver-test-4748f2f556591bb7.elb.us-west[k4 ]2 。 amazonaws.com:6443 --令牌 u9hmb3.gwfozvsz90k3yt9g --发现-token-ca-cert-hash sha256:24c354cce46de9c1eb1a8358b9ba064166e87cf6c011fecaae3350c3910c215a
验证:
kubectl getnodesNAME STATUS ROLES VERSIONip-172[ k4 ] 31- 17 -44.us-west-2.compute.internal Ready Master 4m2s v1.13.0ip-172-31-22-135.us-west- ]2.compute.internal 就绪主控 3m59s v1.13.0ip-172-31-22-208.us-west-2.compute.internal 就绪主控 16h v1.13.0ip -172-31-29-58.us-west-2.compute.internal 就绪 14 小时 v1.13.0
部署附加组件部署AWS sts
kubectl apply -f https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/storage-class 创建/ aws/default .yaml
alb-ingress-controller标记子网
标记您的 AWS 子网,以便入口控制器可以自动发现用于 ALB 的子网。
kubernetes.io/cluster/${cluster-name} 必须设置为拥有或共享
kubernetes.io/role/internal-elb 必须设置对于内部负载均衡器,为 1 或 ``
kubernetes.io/role/elb 对于互联网 - 端负载均衡器,为 1 或 `` 必须。
rbac
kubectl apply -f https://raw.githubusercontent.com/kubernetes-sigs/aws-alb-ingress-controller /v1.0.1/docs/examples/rbac-role .yaml
创建 yaml
# 应用程序负载均衡器 (ALB) 入口控制器部署清单 # 此清单提供合理的默认值。有关部署 ALB 入口控制器的详细信息。 # GitHub: https://github.com/kubernetes-sigs/aws-alb-ingress-controllerapiVersion: apps/v1kind: 部署元数据:Label: app: alb-ingress-controller name: alb-ingress-controller # ALB Ingress 控制器运行的命名空间。 它不会影响输入资源可以解析到的 # 命名空间。 Ingress # 有关命名空间范围限制,请参阅 "--watch-namespace:kube-systemannotations:scheduler.alpha.kubernetes.io/ritic-pod:""spec:replicas: 1. 选择器:matchLabels:应用程序:alb-ingress- 控制器策略:RollingUpdate:maxSurge:1 maxUnavailable:1 类型:RollingUpdate 模板:元数据:注释:iam.amazonaws.com/role:arn:aws:iam:: 1234567 :role/Role-KubernetesIngressController-测试标签:App:alb-ingress-控制器规格:Container:-参数:# 限制此 ALB 入口控制器部署解析入口资源的命名空间。 如果留下注释,则将使用所有名称空间。 # - --watch-namespace=your-k8s-namespace # 设置下面的 ingress-class 标志将 # 仅使用带注释 kubernetes.io/ingress 的 Ingress 资源。 类:“alb”受到控制器的尊重。 # 您可以选择该控制器所遵循的类。 - --ingress-class=alb # 集群名称。 在命名由 # 个 ALB 入口控制器创建的资源时使用。 区分 # 个簇。 - --集群-名称=k8s-us-west-test-1# 此 Ingress 控制器用于创建 AWS 资源的 AWS VPC ID。 # 如果不指定,将从ec2metadata中检测。 # - --aws-vpc-id=vpc-xxxxxx # 此 Ingress 控制器运行的 AWS 区域。 # 如果不指定,将从ec2metadata中检测。 # 区域列表:http://docs.aws.amazon.com/general/latest/gr/rande.html#vpc_region # - --aws-region=us-west[ k4]1 # 启用发送到 AWS API 的所有出站请求的日志记录。 # 如果需要日志记录,则设置为 true。 # [k4 ] ---aws-api-debug # 重试 aws 调用的最大次数。 # 默认值为 10。 # - --aws-最大 -重试=10 env: # 用于使用 AWS API 进行身份验证的 AWS 密钥 ID。 # 这只是一个例子。 我们建议使用像 # kube2iam 这样的项目来授予访问权限。 #- 名称:AWS_ACCESS_KEY_ID # 值:KEYVALUE # 用于使用 AWS API 进行身份验证的 AWS 密钥 # 此处仅作为示例显示。 我建议你买这件。 # 使用像 kube2iam 这样的项目来授予访问权限。 #- 名称:AWS_SECRET_ACCESS_KEY # 值:SECRETVALUE # ALB 入口控制器存储库的位置。 图片:894847497797.dkr.ecr.us-west-2.amazonaws.com/aws-alb-ingress-controller:v1.0.1 imagePullPolicy:始终名称:服务器 resources: {} TerminationMessagePath: /dev/termination-log dnsPolicy: ClusterFirst restartPolicy: Always securityContext: {} TerminationGracePeriodSeconds: 30 serviceAccountName: alb-ingress serviceAccount: alb-ingress
注意集群-name 指定集群名称。
创建仪表板
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes[ k4]dashboard 。 yaml
您必须创建一个管理员用户并授予其管理员角色绑定。 使用以下 yaml 文件创建管理员用户并授予管理员权限: 然后,您可以通过令牌登录仪表板。 对于此文件:admin-role .yaml
kind:ClusterRoleBindingapiVersion:rbac.authorization.k8s.io/v1beta1metadata:name:admin注释:rbac.authorization.kubernetes.io/autoupdate:“true。 “ roleRef: 类型: ClusterRole 名称: cluster-admin apiGroup: rbac.authorization.k8s.iosubjects:- 类型:ServiceAccount 名称:管理员 命名空间:kube-system---api版本:v1kind:ServiceAccount元数据:名称:管理员 命名空间:kube -system label: kubernetes.io/cluster-service: "true" addonmanager.kubernetes.io/mode: 调整
获取token
kubectl -n kube-system获取 Secret|grep admin-tokenadmin-token-cs4gs kubernetes.io/service-account-token 3 10mkubectl 描述 Secret admin-token-cs4gs [k4 ]n kube[k4 ] ]system
重新部署操作
kubeadm resiptables -F && iptables -t nat -F && iptables -t mangle [ k4]F && iptables [ k4 ]Xipvsadm --clearifconfig tunl0 downip link delete tunl0
升级 kubeadm 等
升级 kubeadm
导出 VERSION=$(curl -sSL https://dl.k8s.io/release/stable.txt) # 或手动指定发布的 Kubernetes 版本 export ARCH=amd64 # 或: arm, arm64, ppc64le , s390xcurl - sSL https://dl.k8s.io/release/${VERSION}/bin/linux/${ARCH}/kubeadm > /usr/bin/kubeadmchmod a+rx /usr/bin/kubeadm
升级 kubectl
export VERSION=$(curl -sSL https://dl.k8s.io/release/stable.txt) # 或发布的 Kubernetes 手动指定版本 export ARCH=amd64 # 或:arm,arm64,ppc64le,s390xcurl -sSL https://dl.k8s.io/release/${VERSION}/bin/linux/${ARCH} /kubectl > /usr/bin/kubectlchmod a+rx / usr/ bin/kubectl
升级 kubelet
export VERSION=$(curl -sSL https://dl .k8s.io/release/stable.txt) # 或手动已发布的 Kubernetes 版本 export ARCH=amd64 # 或:arm、arm64、ppc64le、s390xcurl -sSL https://dl.k8s.io/release/${VERSION}/bin/linux/${ARCH}/kubelet > /usr/bin/kubeletchmod a+rx /usr/bin/kubelet
评论前必须登录!
注册