设为首页 收藏本站
查看: 1086|回复: 0

[经验分享] kubernetes1.10部署

[复制链接]

尚未签到

发表于 2018-9-15 12:46:18 | 显示全部楼层 |阅读模式
  一、环境准备
  目前搭建仍然采用 5 台虚拟机测试,基本环境如下
  IP  Type    Docker  OS
  192.168.1.61    master、node、etcd    18.03.0-ce  ubuntu 16.04
  192.168.1.62    master、node、etcd    18.03.0-ce  ubuntu 16.04
  192.168.1.63    master、node、etcd    18.03.0-ce  ubuntu 16.04
  192.168.1.64    node    18.03.0-ce  ubuntu 16.04
  192.168.1.65    node    18.03.0-ce  ubuntu 16.04
  搭建前请看完整篇文章后再操作,一些变更说明我放到后面了;还有为了尽可能的懒,也不用什么 rpm、deb 了,直接 hyperkube + service 配置,布吉岛 hyperkube 的请看 GitHub;本篇文章基于一些小脚本搭建(懒),所以不会写太详细的步骤,具体请参考 仓库脚本,如果想看更详细的每一步的作用可以参考以前的 1.7、1.8 的搭建文档
  二、搭建 Etcd 集群
  2.1、安装 cfssl
  说实话这个章节我不想写,但是考虑可能有人真的需要,所以还是写了一下;这个安装脚本使用的是我私人的 cdn,文件可能随时删除,想使用最新版本请自行从 Github clone 并编译
  wget https://mritdftp.b0.upaiyun.com/cfssl/cfssl.tar.gz
  tar -zxvf cfssl.tar.gz
  mv cfssl cfssljson /usr/local/bin
  chmod +x /usr/local/bin/cfssl /usr/local/bin/cfssljson
  rm -f cfssl.tar.gz
  2.2、生成 Etcd 证书
  etcd-csr.json
  {
  "key": {
  "algo": "rsa",
  "size": 2048
  },
  "names": [
  {
  "O": "etcd",
  "OU": "etcd Security",
  "L": "Beijing",
  "ST": "Beijing",
  "C": "CN"
  }
  ],
  "CN": "etcd",
  "hosts": [
  "127.0.0.1",
  "localhost",
  "192.168.1.61",
  "192.168.1.62",
  "192.168.1.63"
  ]
  }
  etcd-gencert.json
  {
  "signing": {
  "default": {
  "usages": [
  "signing",
  "key encipherment",
  "server auth",
  "client auth"
  ],
  "expiry": "87600h"
  }
  }
  }
  etcd-root-ca-csr.json
  {
  "key": {
  "algo": "rsa",
  "size": 4096
  },
  "names": [
  {
  "O": "etcd",
  "OU": "etcd Security",
  "L": "Beijing",
  "ST": "Beijing",
  "C": "CN"
  }
  ],
  "CN": "etcd-root-ca"
  }
  生成证书
  cfssl gencert --initca=true etcd-root-ca-csr.json | cfssljson --bare etcd-root-ca
  cfssl gencert --ca etcd-root-ca.pem --ca-key etcd-root-ca-key.pem --config etcd-gencert.json etcd-csr.json | cfssljson --bare etcd
  生成后如下
  gen etcd certs
  2.3、安装 Etcd
  Etcd 这里采用最新的 3.2.18 版本,安装方式直接复制二进制文件、systemd service 配置即可,不过需要注意相关用户权限问题,以下脚本配置等参考了 etcd rpm 安装包
  etcd.service
  [Unit]
  Description=Etcd Server
  After=network.target
  After=network-online.target
  Wants=network-online.target
  [Service]
  Type=notify
  WorkingDirectory=/var/lib/etcd/
  EnvironmentFile=-/etc/etcd/etcd.conf
  User=etcd

set GOMAXPROCS to number of processors
  ExecStart=/bin/bash -c "GOMAXPROCS=$(nproc) /usr/local/bin/etcd --name=\"${ETCD_NAME}\" --data-dir=\"${ETCD_DATA_DIR}\" --listen-client-urls=\"${ETCD_LISTEN_CLIENT_URLS}\""
  Restart=on-failure
  LimitNOFILE=65536
  [Install]
  WantedBy=multi-user.target
  etcd.conf

[member]
  ETCD_NAME=etcd1
  ETCD_DATA_DIR="/var/lib/etcd/etcd1.etcd"
  ETCD_WAL_DIR="/var/lib/etcd/wal"
  ETCD_SNAPSHOT_COUNT="100"
  ETCD_HEARTBEAT_INTERVAL="100"
  ETCD_ELECTION_TIMEOUT="1000"
  ETCD_LISTEN_PEER_URLS="https://192.168.1.61:2380"
  ETCD_LISTEN_CLIENT_URLS="https://192.168.1.61:2379,http://127.0.0.1:2379"
  ETCD_MAX_SNAPSHOTS="5"
  ETCD_MAX_WALS="5"
  #ETCD_CORS=""

[cluster]
  ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.1.61:2380"

if you use different ETCD_NAME (e.g. test), set ETCD_INITIAL_CLUSTER value for this name, i.e. "test=http://..."
  ETCD_INITIAL_CLUSTER="etcd1=https://192.168.1.61:2380,etcd2=https://192.168.1.62:2380,etcd3=https://192.168.1.63:2380"
  ETCD_INITIAL_CLUSTER_STATE="new"
  ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
  ETCD_ADVERTISE_CLIENT_URLS="https://192.168.1.61:2379"
  #ETCD_DISCOVERY=""
  #ETCD_DISCOVERY_SRV=""
  #ETCD_DISCOVERY_FALLBACK="proxy"
  #ETCD_DISCOVERY_PROXY=""
  #ETCD_STRICT_RECONFIG_CHECK="false"
  #ETCD_AUTO_COMPACTION_RETENTION="0"

[proxy]
  #ETCD_PROXY="off"
  #ETCD_PROXY_FAILURE_WAIT="5000"
  #ETCD_PROXY_REFRESH_INTERVAL="30000"
  #ETCD_PROXY_DIAL_TIMEOUT="1000"
  #ETCD_PROXY_WRITE_TIMEOUT="5000"
  #ETCD_PROXY_READ_TIMEOUT="0"

[security]
  ETCD_CERT_FILE="/etc/etcd/ssl/etcd.pem"
  ETCD_KEY_FILE="/etc/etcd/ssl/etcd-key.pem"
  ETCD_CLIENT_CERT_AUTH="true"
  ETCD_TRUSTED_CA_FILE="/etc/etcd/ssl/etcd-root-ca.pem"
  ETCD_AUTO_TLS="true"
  ETCD_PEER_CERT_FILE="/etc/etcd/ssl/etcd.pem"
  ETCD_PEER_KEY_FILE="/etc/etcd/ssl/etcd-key.pem"
  ETCD_PEER_CLIENT_CERT_AUTH="true"
  ETCD_PEER_TRUSTED_CA_FILE="/etc/etcd/ssl/etcd-root-ca.pem"
  ETCD_PEER_AUTO_TLS="true"

[logging]
  #ETCD_DEBUG="false"

examples for -log-package-levels etcdserver=WARNING,security=DEBUG
  #ETCD_LOG_PACKAGE_LEVELS=""
  install.sh
  #!/bin/bash
  set -e
  ETCD_VERSION="3.2.18"
  function download(){
  if [ ! -f "etcd-v${ETCD_VERSION}-linux-amd64.tar.gz" ]; then
  wget https://github.com/coreos/etcd/releases/download/v${ETCD_VERSION}/etcd-v${ETCD_VERSION}-linux-amd64.tar.gz
  tar -zxvf etcd-v${ETCD_VERSION}-linux-amd64.tar.gz
  fi
  }
  function preinstall(){
  getent group etcd >/dev/null || groupadd -r etcd
  getent passwd etcd >/dev/null || useradd -r -g etcd -d /var/lib/etcd -s /sbin/nologin -c "etcd user" etcd
  }
  function install(){
  echo -e "\033[32mINFO: Copy etcd...\033[0m"
  tar -zxvf etcd-v${ETCD_VERSION}-linux-amd64.tar.gz
  cp etcd-v${ETCD_VERSION}-linux-amd64/etcd* /usr/local/bin
  rm -rf etcd-v${ETCD_VERSION}-linux-amd64
  

echo -e "\033[32mINFO: Copy etcd config...\033[0m"  
cp -r conf /etc/etcd
  
chown -R etcd:etcd /etc/etcd
  
chmod -R 755 /etc/etcd/ssl
  

  
echo -e "\033[32mINFO: Copy etcd systemd config...\033[0m"
  
cp systemd/*.service /lib/systemd/system
  
systemctl daemon-reload
  

  }
  function postinstall(){
  if [ ! -d "/var/lib/etcd" ]; then
  mkdir /var/lib/etcd
  chown -R etcd:etcd /var/lib/etcd
  fi
  }
  download
  preinstall
  install
  postinstall
  脚本解释如下:
  download: 从 Github 下载二进制文件并解压
  preinstall: 为 Etcd 安装做准备,创建 etcd 用户,并指定家目录登录 shell 等
  install: 将 etcd 二进制文件复制到安装目录(/usr/local/bin),复制 conf 目录到 /etc/etcd
  postinstall: 安装后收尾工作,比如检测 /var/lib/etcd 是否存在,纠正权限等
  整体目录结构如下
  etcd
  ├── conf
  │   ├── etcd.conf
  │   └── ssl
  │       ├── etcd.csr
  │       ├── etcd-csr.json
  │       ├── etcd-gencert.json
  │       ├── etcd-key.pem
  │       ├── etcd.pem
  │       ├── etcd-root-ca.csr
  │       ├── etcd-root-ca-csr.json
  │       ├── etcd-root-ca-key.pem
  │       └── etcd-root-ca.pem
  ├── etcd.service
  └── install.sh
  请自行创建 conf 目录等,并放置好相关文件,保存上面脚本为 install.sh,直接执行即可;在每台机器上更改好对应的配置,如 etcd 名称等,etcd 估计都是轻车熟路了,这里不做过多阐述;安装后启动即可
  systemctl start etcd
  systemctl enable etcd
  注意: 集群 etcd 要 3 个一起启动,集群模式下单个启动会卡半天最后失败,不要傻等;启动成功后测试如下
  export ETCDCTL_API=3
  etcdctl --cacert=/etc/etcd/ssl/etcd-root-ca.pem --cert=/etc/etcd/ssl/etcd.pem --key=/etc/etcd/ssl/etcd-key.pem --endpoints=https://192.168.1.61:2379,https://192.168.1.62:2379,https://192.168.1.63:2379 endpoint health
  check etcd
  三、安装 Kubernets 集群组件
  注意:与以前文档不同的是,这次不依赖 rpm 等特定安装包,而是基于 hyperkube 二进制手动安装,每个节点都会同时安装 Master 与 Node 配置文件,具体作为 Master 还是 Node 取决于服务开启情况
  3.1、生成 Kubernetes 证书
  由于 kubelet 和 kube-proxy 用到的 kubeconfig 配置文件需要借助 kubectl 来生成,所以需要先安装一下 kubectl
  wget https://storage.googleapis.com/kubernetes-release/release/v1.10.1/bin/linux/amd64/hyperkube -O hyperkube_1.10.1
  chmod +x hyperkube_1.10.1
  cp hyperkube_1.10.1 /usr/local/bin/hyperkube
  ln -s /usr/local/bin/hyperkube /usr/local/bin/kubectl
  admin-csr.json
  {
  "CN": "admin",
  "hosts": [],
  "key": {
  "algo": "rsa",
  "size": 2048
  },
  "names": [
  {
  "C": "CN",
  "ST": "BeiJing",
  "L": "BeiJing",
  "O": "system:masters",
  "OU": "System"
  }
  ]
  }
  k8s-gencert.json
  {
  "signing": {
  "default": {
  "expiry": "87600h"
  },
  "profiles": {
  "kubernetes": {
  "usages": [
  "signing",
  "key encipherment",
  "server auth",
  "client auth"
  ],
  "expiry": "87600h"
  }
  }
  }
  }
  k8s-root-ca-csr.json
  {
  "CN": "kubernetes",
  "key": {
  "algo": "rsa",
  "size": 4096
  },
  "names": [
  {
  "C": "CN",
  "ST": "BeiJing",
  "L": "BeiJing",
  "O": "k8s",
  "OU": "System"
  }
  ]
  }
  kube-apiserver-csr.json
  注意: 在以前的文档中这个配置叫 kubernetes-csr.json,为了明确划分职责,这个证书目前被重命名以表示其专属于 apiserver 使用;加了一个 *.kubernetes.master 域名以便内部私有 DNS 解析使用(可删除);至于很多人问过 kubernetes 这几个能不能删掉,答案是不可以的;因为当集群创建好后,default namespace 下会创建一个叫 kubenretes 的 svc,有一些组件会直接连接这个 svc 来跟 api 通讯的,证书如果不包含可能会出现无法连接的情况;其他几个 kubernetes 开头的域名作用相同
  {
  "CN": "kubernetes",
  "hosts": [
  "127.0.0.1",
  "10.254.0.1",
  "192.168.1.61",
  "192.168.1.62",
  "192.168.1.63",
  "192.168.1.64",
  "192.168.1.65",
  "*.kubernetes.master",
  "localhost",
  "kubernetes",
  "kubernetes.default",
  "kubernetes.default.svc",
  "kubernetes.default.svc.cluster",
  "kubernetes.default.svc.cluster.local"
  ],
  "key": {
  "algo": "rsa",
  "size": 2048
  },
  "names": [
  {
  "C": "CN",
  "ST": "BeiJing",
  "L": "BeiJing",
  "O": "k8s",
  "OU": "System"
  }
  ]
  }
  kube-proxy-csr.json
  {
  "CN": "system:kube-proxy",
  "hosts": [],
  "key": {
  "algo": "rsa",
  "size": 2048
  },
  "names": [
  {
  "C": "CN",
  "ST": "BeiJing",
  "L": "BeiJing",
  "O": "k8s",
  "OU": "System"
  }
  ]
  }
  生成证书及配置

生成 CA
  cfssl gencert --initca=true k8s-root-ca-csr.json | cfssljson --bare k8s-root-ca

依次生成其他组件证书
  for targetName in kube-apiserver admin kube-proxy; do
  cfssl gencert --ca k8s-root-ca.pem --ca-key k8s-root-ca-key.pem --config k8s-gencert.json --profile kubernetes $targetName-csr.json | cfssljson --bare $targetName
  done

地址默认为 127.0.0.1:6443

如果在 master 上启用 kubelet 请在生成后的 kubeconfig 中

修改该地址为 当前MASTER_IP:6443
  KUBE_APISERVER="https://127.0.0.1:6443"
  BOOTSTRAP_TOKEN=$(head -c 16 /dev/urandom | od -An -t x | tr -d ' ')
  echo "Tokne: ${BOOTSTRAP_TOKEN}"

不要质疑 system:bootstrappers 用户组是否写错了,有疑问请参考官方文档

https://kubernetes.io/docs/admin/kubelet-tls-bootstrapping/
  cat > token.csv  audit-policy.yaml /dev/null || useradd -r -g kube -d / -s /sbin/nologin -c "Kubernetes user" kube
  }
  function installk8s(){
  echo -e "\033[32mINFO: Copy hyperkube...\033[0m"
  cp hyperkube${KUBE_VERSION} /usr/local/bin/hyperkube
  

echo -e "\033[32mINFO: Create symbolic link...\033[0m"  
ln -sf /usr/local/bin/hyperkube /usr/local/bin/kubectl
  

  
echo -e "\033[32mINFO: Copy kubernetes config...\033[0m"
  
cp -r conf /etc/kubernetes
  
if [ -d "/etc/kubernetes/ssl" ]; then
  chown -R kube:kube /etc/kubernetes/ssl
  
fi
  

  
echo -e "\033[32mINFO: Copy kubernetes systemd config...\033[0m"
  
cp systemd/*.service /lib/systemd/system
  
systemctl daemon-reload
  

  }
  function postinstall(){
  if [ ! -d "/var/log/kube-audit" ]; then
  mkdir /var/log/kube-audit
  fi
  

if [ ! -d "/var/lib/kubelet" ]; then  mkdir /var/lib/kubelet
  
fi
  

  
if [ ! -d "/usr/libexec" ]; then
  mkdir /usr/libexec
  
fi
  
chown -R kube:kube /var/log/kube-audit /var/lib/kubelet /usr/libexec
  

  }
  download_k8s
  preinstall
  install_k8s
  postinstall
  脚本解释如下:
  download_k8s: 下载 hyperkube 二进制文件
  preinstall: 安装前处理,同 etcd 一样创建 kube 普通用户指定家目录、shell 等
  install_k8s: 复制 hyperkube 到安装目录,为 kubectl 创建软连接(为啥创建软连接就能执行请自行阅读 源码),复制相关配置到对应目录,并处理权限
  postinstall: 收尾工作,创建日志目录等,并处理权限
  最后执行此脚本安装即可,此外,应确保每个节点安装了 ipset、conntrack 两个包,因为 kube-proxy 组件会使用其处理 iptables 规则等
  四、启动 Kubernetes Master 节点
  对于 master 节点启动无需做过多处理,多个 master 只要保证 apiserver 等配置中的 ip 地址监听没问题后直接启动即可
  systemctl daemon-reload
  systemctl start kube-apiserver
  systemctl start kube-controller-manager
  systemctl start kube-scheduler
  systemctl enable kube-apiserver
  systemctl enable kube-controller-manager
  systemctl enable kube-scheduler
  成功后截图如下
  Master success
  五、启动 Kubernetes Node 节点
  由于 HA 等功能需要,对于 Node 需要做一些处理才能启动,主要有以下两个地方需要处理
  5.1、nginx-proxy
  在启动 kubelet、kube-proxy 服务之前,需要在本地启动 nginx 来 tcp 负载均衡 apiserver 6443 端口,nginx-proxy 使用 docker + systemd 启动,配置如下
  注意: 对于在 master 节点启动 kubelet 来说,不需要 nginx 做负载均衡;可以跳过此步骤,并修改 kubelet.kubeconfig、kube-proxy.kubeconfig 中的 apiserver 地址为当前 master ip 6443 端口即可
  nginx-proxy.service
  [Unit]
  Description=kubernetes apiserver docker wrapper
  Wants=docker.socket
  After=docker.service
  [Service]
  User=root
  PermissionsStartOnly=true
  ExecStart=/usr/bin/docker run -p 127.0.0.1:6443:6443 \
  -v /etc/nginx:/etc/nginx \
  --name nginx-proxy \
  --net=host \
  --restart=on-failure:5 \
  --memory=512M \
  nginx:1.13.12-alpine
  ExecStartPre=-/usr/bin/docker rm -f nginx-proxy
  ExecStop=/usr/bin/docker stop nginx-proxy
  Restart=always
  RestartSec=15s
  TimeoutStartSec=30s
  [Install]
  WantedBy=multi-user.target
  nginx.conf
  error_log stderr notice;
  worker_processes auto;
  events {
  multi_accept on;
  use epoll;
  worker_connections 1024;
  }
  stream {
  upstream kube_apiserver {
  least_conn;
  server 192.168.1.61:6443;
  server 192.168.1.62:6443;
  server 192.168.1.63:6443;
  }
  

server {  listen        0.0.0.0:6443;
  proxy_pass    kube_apiserver;
  proxy_timeout 10m;
  proxy_connect_timeout 1s;
  
}
  

  }
  启动 apiserver 的本地负载均衡
  mkdir /etc/nginx
  cp nginx.conf /etc/nginx
  cp nginx-proxy.service /lib/systemd/system
  systemctl daemon-reload
  systemctl start nginx-proxy
  systemctl enable nginx-proxy
  5.2、TLS bootstrapping
  创建好 nginx-proxy 后不要忘记为 TLS Bootstrap 创建相应的 RBAC 规则,这些规则能实现证自动签署 TLS Bootstrap 发出的 CSR 请求,从而实现证书轮换(创建一次即可);详情请参考 Kubernetes TLS bootstrapping 那点事
  tls-bootstrapping-clusterrole.yaml(与 1.8 一样)

A ClusterRole which instructs the CSR approver to approve a node requesting a

serving cert matching its client cert.
  kind: ClusterRole
  apiVersion: rbac.authorization.k8s.io/v1
  metadata:
  name: system:certificates.k8s.io:certificatesigningrequests:selfnodeserver
  rules:


  • apiGroups: ["certificates.k8s.io"]  resources: ["certificatesigningrequests/selfnodeserver"]
      verbs: ["create"]
      在 master 执行创建

给与 kubelet-bootstrap 用户进行 node-bootstrapper 的权限
  kubectl create clusterrolebinding kubelet-bootstrap \
  --clusterrole=system:node-bootstrapper \
  --user=kubelet-bootstrap
  kubectl create -f tls-bootstrapping-clusterrole.yaml

自动批准 system:bootstrappers 组用户 TLS bootstrapping 首次申请证书的 CSR 请求
  kubectl create clusterrolebinding node-client-auto-approve-csr \
  --clusterrole=system:certificates.k8s.io:certificatesigningrequests:nodeclient \
  --group=system:bootstrappers

自动批准 system:nodes 组用户更新 kubelet 自身与 apiserver 通讯证书的 CSR 请求
  kubectl create clusterrolebinding node-client-auto-renew-crt \
  --clusterrole=system:certificates.k8s.io:certificatesigningrequests:selfnodeclient \
  --group=system:nodes

自动批准 system:nodes 组用户更新 kubelet 10250 api 端口证书的 CSR 请求
  kubectl create clusterrolebinding node-server-auto-renew-crt \
  --clusterrole=system:certificates.k8s.io:certificatesigningrequests:selfnodeserver \
  --group=system:nodes
  5.3、执行启动
  多节点部署时先启动好 nginx-proxy,然后修改好相应配置的 ip 地址等配置,最终直接启动即可(master 上启动 kubelet 不要忘了修改 kubeconfig 中的 apiserver 地址,还有对应的 kubelet 的 node label)
  systemctl daemon-reload
  systemctl start kubelet
  systemctl start kube-proxy
  systemctl enable kubelet
  systemctl enable kube-proxy
  最后启动成功后如下
  cluster started
  五、安装 Calico
  Calico 安装仍然延续以前的方案,使用 Daemonset 安装 cni 组件,使用 systemd 控制 calico-node 以确保 calico-node 能正确的拿到主机名等
  5.1、修改 Calico 配置
  wget https://docs.projectcalico.org/v3.1/getting-started/kubernetes/installation/hosted/calico.yaml -O calico.example.yaml
  ETCD_CERT=cat /etc/etcd/ssl/etcd.pem | base64 | tr -d '\n'
  ETCD_KEY=cat /etc/etcd/ssl/etcd-key.pem | base64 | tr -d '\n'
  ETCD_CA=cat /etc/etcd/ssl/etcd-root-ca.pem | base64 | tr -d '\n'
  ETCD_ENDPOINTS="https://192.168.1.61:2379,https://192.168.1.62:2379,https://192.168.1.63:2379"
  cp calico.example.yaml calico.yaml
  sed -i "s@.etcd_endpoints:.@\ \ etcd_endpoints:\ \"${ETCD_ENDPOINTS}\"@gi" calico.yaml
  sed -i "s@.etcd-cert:.@\ \ etcd-cert:\ ${ETCD_CERT}@gi" calico.yaml
  sed -i "s@.etcd-key:.@\ \ etcd-key:\ ${ETCD_KEY}@gi" calico.yaml
  sed -i "s@.etcd-ca:.@\ \ etcd-ca:\ ${ETCD_CA}@gi" calico.yaml
  sed -i 's@.etcd_ca:.@\ \ etcd_ca:\ "/calico-secrets/etcd-ca"@gi' calico.yaml
  sed -i 's@.etcd_cert:.@\ \ etcd_cert:\ "/calico-secrets/etcd-cert"@gi' calico.yaml
  sed -i 's@.etcd_key:.@\ \ etcd_key:\ "/calico-secrets/etcd-key"@gi' calico.yaml

注释掉 calico-node 部分(由 Systemd 接管)
  sed -i '123,219s@.*@#&@gi' calico.yaml
  5.2、创建 Systemd 文件
  注意: 创建 systemd service 配置文件要在每个节点上都执行
  K8S_MASTER_IP="192.168.1.61"
  HOSTNAME=cat /etc/hostname
  ETCD_ENDPOINTS="https://192.168.1.61:2379,https://192.168.1.62:2379,https://192.168.1.63:2379"
  cat > /lib/systemd/system/calico-node.service  coredns.yaml
  最后使用 kubectl 创建一下

执行上面的替换脚本
  ./deploy.sh

创建 CoreDNS
  kubectl create -f coredns.yaml
  测试截图如下
  test dns
  6.2、部署 DNS 自动扩容
  自动扩容跟以往一样,yaml 创建一下就行
  dns-horizontal-autoscaler.yaml

Copyright 2016 The Kubernetes Authors.
  #

Licensed under the Apache License, Version 2.0 (the "License");

you may not use this file except in compliance with the License.

You may obtain a copy of the License at
  #

http://www.apache.org/licenses/LICENSE-2.0
  #

Unless required by applicable law or agreed to in writing, software

distributed under the License is distributed on an "AS IS" BASIS,

WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

See the License for the specific language governing permissions and

limitations under the License.

kind: ServiceAccount
  apiVersion: v1
  metadata:
  name: kube-dns-autoscaler
  namespace: kube-system
  labels:
  addonmanager.kubernetes.io/mode: Reconcile

  kind: ClusterRole
  apiVersion: rbac.authorization.k8s.io/v1
  metadata:
  name: system:kube-dns-autoscaler
  labels:
  addonmanager.kubernetes.io/mode: Reconcile
  rules:


  • apiGroups: [""]  resources: ["nodes"]
      verbs: ["list"]

  • apiGroups: [""]  resources: ["replicationcontrollers/scale"]
      verbs: ["get", "update"]

  • apiGroups: ["extensions"]  resources: ["deployments/scale", "replicasets/scale"]
      verbs: ["get", "update"]

    Remove the configmaps rule once below issue is fixed:

    kubernetes-incubator/cluster-proportional-autoscaler#16

  • apiGroups: [""]
      resources: ["configmaps"]
      verbs: ["get", "create"]

      kind: ClusterRoleBinding
      apiVersion: rbac.authorization.k8s.io/v1
      metadata:
      name: system:kube-dns-autoscaler
      labels:
      addonmanager.kubernetes.io/mode: Reconcile
      subjects:

  • kind: ServiceAccount  name: kube-dns-autoscaler
      namespace: kube-system
      roleRef:
      kind: ClusterRole
      name: system:kube-dns-autoscaler
      apiGroup: rbac.authorization.k8s.io

  apiVersion: apps/v1
  kind: Deployment
  metadata:
  name: kube-dns-autoscaler
  namespace: kube-system
  labels:
  k8s-app: kube-dns-autoscaler
  kubernetes.io/cluster-service: "true"
  addonmanager.kubernetes.io/mode: Reconcile
  spec:
  selector:
  matchLabels:
  k8s-app: kube-dns-autoscaler
  template:
  metadata:
  labels:
  k8s-app: kube-dns-autoscaler
  annotations:
  scheduler.alpha.kubernetes.io/critical-pod: ''
  spec:
  priorityClassName: system-cluster-critical
  containers:


  • name: autoscaler  image: k8s.gcr.io/cluster-proportional-autoscaler-amd64:1.1.2-r2
      resources:
      requests:
      cpu: "20m"
      memory: "10Mi"
      command:


    • /cluster-proportional-autoscaler
    • --namespace=kube-system
    • --configmap=kube-dns-autoscaler
      Should keep target in sync with cluster/addons/dns/kube-dns.yaml.base
    • --target=Deployment/kube-dns
      When cluster is using large nodes(with more cores), "coresPerReplica" should dominate.

      If using small nodes, "nodesPerReplica" should dominate.
    • --default-params={"linear":{"coresPerReplica":256,"nodesPerReplica":16,"preventSinglePointFailure":true}}
    • --logtostderr=true
    • --v=2  tolerations:


  • key: "CriticalAddonsOnly"  operator: "Exists"
      serviceAccountName: kube-dns-autoscaler
      七、部署 heapster
      heapster 部署相对简单的多,yaml 创建一下就可以了

  kubectl create -f https://raw.githubusercontent.com/kubernetes/heapster/master/deploy/kube-config/influxdb/grafana.yaml
  kubectl create -f https://raw.githubusercontent.com/kubernetes/heapster/master/deploy/kube-config/influxdb/heapster.yaml
  kubectl create -f https://raw.githubusercontent.com/kubernetes/heapster/master/deploy/kube-config/influxdb/influxdb.yaml
  kubectl create -f https://raw.githubusercontent.com/kubernetes/heapster/master/deploy/kube-config/rbac/heapster-rbac.yaml
  八、部署 Dashboard
  8.1、部署 Dashboard
  Dashboard 部署同 heapster 一样,不过为了方便访问,我设置了 NodePort,还注意到一点是 yaml 拉取策略已经没有比较傻的 Always 了
  wget https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml -O kubernetes-dashboard.yaml
  将最后部分的端口暴露修改如下

------------------- Dashboard Service -------------------
  kind: Service
  apiVersion: v1
  metadata:
  labels:
  k8s-app: kubernetes-dashboard
  name: kubernetes-dashboard
  namespace: kube-system
  spec:
  type: NodePort
  ports:


  • name: dashboard-tls  port: 443
      targetPort: 8443
      nodePort: 30000
      protocol: TCP
      selector:
      k8s-app: kubernetes-dashboard
      然后执行 kubectl create -f kubernetes-dashboard.yaml 即可

  8.2、创建 admin 账户
  默认情况下部署成功后可以直接访问 https://NODE_IP:30000 访问,但是想要登录进去查看的话需要使用 kubeconfig 或者 access token 的方式;实际上这个就是 RBAC 授权控制,以下提供一个创建 admin access token 的脚本,更细节的权限控制比如只读用户可以参考 使用 RBAC 控制 kubectl 权限,RBAC 权限控制原理是一样的
  #!/bin/bash
  if kubectl get sa dashboard-admin -n kube-system &> /dev/null;then
  echo -e "\033[33mWARNING: ServiceAccount dashboard-admin exist!\033[0m"
  else
  kubectl create sa dashboard-admin -n kube-system
  kubectl create clusterrolebinding dashboard-admin --clusterrole=cluster-admin --serviceaccount=kube-system:dashboard-admin
  fi
  kubectl describe secret -n kube-system $(kubectl get secrets -n kube-system | grep dashboard-admin | cut -f1 -d ' ') | grep -E '^token'
  将以上脚本保存为 create_dashboard_sa.sh 执行即可,成功后访问截图如下(如果访问不了的话请检查下 iptable FORWARD 默认规则是否为 DROP,如果是将其改为 ACCEPT 即可)
  create_dashboard_sa
  dashboard
  九、其他说明
  9.1、选项 label 等说明
  部署过程中注意到一些选项已经做了名称更改,比如 --network-plugin-dir 变更为 --cni-bin-dir 等,具体的那些选项做了变更请自行对比配置,以及查看官方文档;
  对于 Node label --node-labels=node-role.kubernetes.io/k8s-node=true 这个选项,它的作用只是在 kubectl get node 时 ROLES 栏显示是什么节点;不过需要注意 master 上的 kubelet 不要将 node-role.kubernetes.io/k8s-master=true 更改成 node-role.kubernetes.io/master=xxxx;后面这个 node-role.kubernetes.io/master 是 kubeadm 用的,这个 label 会告诉 k8s 调度器当前节点为 master,从而执行一些特定动作,比如 node-role.kubernetes.io/master:NoSchedule 此节点将不会被分配 pod;具体参见 kubespray issue 以及 官方设计文档
  很多人可能会发现大约 1 小时候 kubectl get csr 看不到任何 csr 了,这是因为最新版本增加了 csr 清理功能,默认对于 approved 和 denied 状态的 csr 一小时后会被清理,对于 pending 状态的 csr 24 小时后会被清理,想问时间从哪来的请看 代码;PR issue 我忘记了,增加这个功能的起因大致就是因为当开启了证书轮换后,csr 会不断增加,所以需要增加一个清理功能
  9.2、异常及警告说明
  在部署过程中我记录了一些异常警告等,以下做一下统一说明

https://github.com/kubernetes/kubernetes/issues/42158

这个问题还没解决,PR 没有合并被关闭了,可以关注一下上面这个 issue,被关闭的 PR 在下面

https://github.com/kubernetes/kubernetes/pull/49567
  Failed to update statusUpdateNeeded field in actual state of world: Failed to set statusUpdateNeeded to needed true, because nodeName=...

https://github.com/kubernetes/kubernetes/issues/59993

这个似乎已经解决了,没时间测试,PR 地址在下面,我大致 debug 一下 好像是 cAdvisor 的问题

https://github.com/opencontainers/runc/pull/1722
  Failed to get system container stats for "/kubepods": failed to get cgroup stats for "/kubepods": failed to get container info for "/kubepods": unknown containe "/kubepods"

https://github.com/kubernetes/kubernetes/issues/58217

注意: 这个问题现在仍未解决,可关注上面的 issue,这个问题可能影响 node image gc

强烈依赖于 kubelet 做 宿主机 image gc 的需要注意一下
  Image garbage collection failed once. Stats initialization may not have completed yet: failed to get imageFs info: unable to find data for container /

没找到太多资料,不过感觉跟上面问题类似
  failed to construct signal: "allocatableMemory.available" error: system container "pods" not found in m



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-583562-1-1.html 上篇帖子: kubernetes之基本使用2-Old 下篇帖子: 如何在GO语言中使用Kubernetes API?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表