Kubectl Install

  • Kubectl 是远程访问的K8s集群命令行工具
  • 连接K8s集群的证书存放在~/.kube/config

安装kubectl

Linux

curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl

 

Windows

  • 安装 Chocolatey (Powershell 管理员运行)
    Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

     

  • 安装 kubectl (Powershell 管理员运行)
    choco install kubernetes-cli

     

  • 安装完成后将config文件放在~/.kube目录下 如果目录~/.kube不存在 自行创建

连接集群

  • 执行kubectl version 验证是否安装成功

参考

Install K8s Cluster in CentOS

相关环境

  • CentOS 7.6
  • K8s 1.16.2
  • Docker 18.09.1

关闭防火墙

systemctl stop firewalld
systemctl disable firewalld

禁用swap

swapoff -a 
  • 修改etc/fstab
  • 在行首加 #,注释/dev/mapper/centos-swap swap

安装Docker

  • k8s支持的Docker版本
    sudo yum install -y yum-utils device-mapper-persistent-data lvm2
    sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    sudo yum install docker-ce-18.09.1 docker-ce-cli-18.09.1 containerd.io
    systemctl start docker.service
    systemctl enable docker.service

     

添加K8s Repo

cat>>/etc/yum.repos.d/kubrenetes.repo<<EOF
[kubernetes]
name=Kubernetes Repo
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
gpgcheck=0
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg
EOF

安装K8s

yum install -y kubeadm  kubelet kubectl

设置k8s开机自启动

systemctl enable kubelet.service

K8s集群

  • 创建集群需注意 如集群有多台机器 请修改每台机器的主机名使集群内各节点主机名不一致

创建K8s集群 Master Node

kubeadm init --image-repository registry.aliyuncs.com/google_containers \
    --pod-network-cidr=10.244.0.0/16 \
    --ignore-preflight-errors=cri \
    --kubernetes-version=1.16.2
  • 输出以下信息表示,K8s与Docker版本不一致
    [WARNING SystemVerification]: this Docker version is not on the list of validated versions: 19.03.4. Latest validated version: 18.09

     

  • 输出以下信息表示,swap没有被禁用
    [ERROR Swap]: running with swap on is not supported. Please disable swap

     

  • 输出以下信息表示,请执行echo '1' > /proc/sys/net/bridge/bridge-nf-call-iptables
    [ERROR FileContent--proc-sys-net-bridge-bridge-nf-call-iptables]: /proc/sys/net/bridge/bridge-nf-call-iptables contents are not set to 1

     

  • 安装成功后, 会显示如下的信息 按步执行即可
      mkdir -p $HOME/.kube
      sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      sudo chown $(id -u):$(id -g) $HOME/.kube/config

     

Init Network Flannel 初始化网络插件

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
  • 由于某种不可抗力 请先下载yml至本机后执行 kubectl apply -f kube-flannel.yml

加入K8s集群 Slave Node

  • 对于从节点 执行步骤至安装K8s 无需init
  • 在master节点上执行, 获取join-token
     kubeadm token create --print-join-command

     

  • 如 kubeadm join 192.168.69.128:6443 --token uc826o.l9na62a2ckmf5rjo --discovery-token-ca-cert-hash sha256:2be9656d7b4c3e9aab2b1259b0eea948f0b0b05d082267aa5676967cc495c168
  • 从节点执行join-token
  • 主机名称不能重复-如果重复即使work节点加入成功,master通过kubectl get node看不到work节点

K8s集群相关命令

  • 集群获取节点 kubectl get nodes
  • 集群删除节点 kubectl delete node <node-name>
  • 被删除的节点重新加入集群 先执行 kubeadm reset

K8s UI kubernetes-dashboard

部署yaml

kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-beta4/aio/deploy/recommended.yaml
  • 此部署文档镜像来源于docker hub
  • 假设部署文档由于众所周知的原因不可访问 请先通过技术手段获取文档后执行部署命令
    kubectl apply -f recommended.yaml

     

  • 使用NodePort方式暴露30065端口 用于非k8s节点中访问 修改yaml以下内容 重新执行部署命令
    kind: Service
    apiVersion: v1
    metadata:
      labels:
        k8s-app: kubernetes-dashboard
      name: kubernetes-dashboard
      namespace: kubernetes-dashboard
    spec:
      type: NodePort
      ports:
        - port: 443
          targetPort: 8443
          nodePort: 30065
      selector:
        k8s-app: kubernetes-dashboard

     

  • NodePort方式默认端口范围30000-32767
  • 获取kubernetes-dashboard访问token
    kubectl -n kube-system describe $(kubectl -n kube-system get secret -o name | grep namespace) | grep token

     

  • 在firefox中访问该网址 https://[k8s节点]:30065 如:master.k8s.zzhong.me:30065 选择token登录并输入访问token
  • kubernetes-dashboard要求使用HTTPS Chrome不能访问此类没有认证的web 可以使用firefox访问

K8s Ingress

Ingress Controller (Nginx)

  • 下载用于安装 Ingress Controller 的部署文件
    mkdir -p ingress
    curl -s -o "ingress/#1.yaml" "https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/{configmap,mandatory,namespace,rbac,with-rbac}.yaml"
    curl -s -o "ingress/service.yaml" "https://raw.githubusercontent.com/kubernetes/ingress-nginx/master/deploy/static/provider/cloud-generic.yaml"

     

  • 修改ingress/service.yaml
  • 注释 externalTrafficPolicy: Local
  • 补充以下内容
      externalIPs:
        - [master节点IP]

     

  • 安装 Ingress Controller
    kubectl create namespace ingress-nginx
    kubectl config set-context $(kubectl config current-context) --namespace "ingress-nginx"
    kubectl apply -f ./ingress
    kubectl rollout status deployments/nginx-ingress-controller

     

Ingress

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: workshop-ingress
  labels:
    app: workshop
  annotations:
    ingress.kubernetes.io/rewrite-target: /
  generation: 1
spec:
  rules:
  - host: webshop.master.k8s.zzhong.me
    http:
      paths:
      - path: /
        backend:
          serviceName: workshop-web
          servicePort: 80
  • 以上是一个Ingress Demo 表示webshop.master.k8s.zzhong.me域名直接访问的流量导入workshop-web服务的80端口 path是nginx的反向代理规则
  • 注意: 在执行上述demo之前 已经将*.master.k8s.zzhong.me的域名解析至[master节点IP]

另一种ingress/service.yaml方式

  • 注释 externalTrafficPolicy: Local
  • 不使用externalIPs 使用NodePort 补充以下内容
      type: NodePort

     

  • 重新部署ingress/service.yaml 通过kubectl get svc | grep ingress-nginx获取ingress-nginx服务的外部端口, 如32375
  • 直接访问webshop.master.k8s.zzhong.me:32375即可

Ingress Https

  • Dashboard需要HTTPS访问 以下是将Dashboard添加HTTPS访问的过程
  1. 申请阿里云的免费的ssl证数并绑定 dashboard.k8s.cxist.cloud 域名 申请过程自行百度
  2. 下载nginx对应的证数 包括***.key 和***pem
  3. 执行以下的命令先获取***.crt并创建tls类型secret kubernetes-dashboard-tls
    openssl x509 -in dashboard.pem -out dashboard.crt
    kubectl create secret tls kubernetes-dashboard-tls --cert=dashboard.crt --key=dashboard.key -n kubernetes-dashboard

     

  4. 创建kubernetes-dashboard-ingress.yaml
    apiVersion: networking.k8s.io/v1beta1
    kind: Ingress
    metadata:
      name: kubernetes-dashboard-ingress
      namespace: kubernetes-dashboard
      annotations:
        nginx.ingress.kubernetes.io/ssl-redirect: "true"
        nginx.ingress.kubernetes.io/rewrite-target: /
        nginx.ingress.kubernetes.io/backend-protocol: "HTTPS"
    spec:
      tls:
      - hosts:
        - dashboard.k8s.cxist.cloud
        secretName: kubernetes-dashboard-tls
      rules:
      - host: dashboard.k8s.cxist.cloud
        http:
          paths:
          - path: /
            backend:
              serviceName: kubernetes-dashboard 
              servicePort: 443

     

  5. 执行kubectl apply -f kubernetes-dashboard-ingress.yaml

User Config

  • k8s安装后 默认admin的kubeconfig在路径/etc/kubernetes/admin.conf
  • k8s集群有ServiceAccount和User两类用户 区别在于ServiceAccount用于程序访问的 User用于人访问的 详情参考
  • 以下是创建user并创建其对应的kubeconfig的sh脚本 使用方法:sh createuser.sh --user-name redz
  • 注意 此脚本会创建用于dashboard访问的token 此token是根据namespace-controller-token-***创建的 此功能允许使用此脚本生成的config访问本集群的dashboard
  • 注意 此脚本创建的用户绑定cluster-admin角色 如需增加或减少角色绑定请修改此sh脚本最后添加 clusterrolebinding部分
    # 变量
    # 变量
    # k8s集群地址
    KUBE_URL=https://192.168.69.128:6443
    # k8s集群名称
    CLUSTER=xcloud
    # 授权时间
    CRT_DAYS=365
    # 用户名
    USER_NAME=no_name
    # 用户组
    USER_GROUP_NAME=TMSDEV
    # 默认命名空间
    DEFAULT_NAMESPACE=tms-dev
    
    while [[ $# -gt 0 ]]
    do
    key="$1"
    case $key in
        --user-name)
        USER_NAME="$2"
        shift
        shift
        ;;
        *)
        shift
        ;;
    esac
    done
    
    echo $USER_NAME
    
    # 在当前目录下添加目录,用来存放证书
    mkdir -p certs/$USER_NAME
     
    # CA 证书可以在 master node 上找到
    # 一般就在 /etc/kubernetes/ssl 或者 /etc/kubernetes/pki 里面
    CA_CRT_PATH=/etc/kubernetes/pki/ca.crt
    CA_KEY_PATH=/etc/kubernetes/pki/ca.key
     
    # 生成私有密钥
    openssl genrsa -out certs/$USER_NAME/$USER_NAME.key 2048
     
    # 用私钥生成证书,CN 表示用户名,O 表示用户组
    openssl req -new -key certs/$USER_NAME/$USER_NAME.key -out certs/$USER_NAME/$USER_NAME.csr \
    -subj "/CN=$USER_NAME/O=$USER_GROUP_NAME"
     
    # 然后用 CA 证书来给刚才生成的证书来签名
    # 在这个例子中,我们给 xizhibei 这个账户签发了一张有效期为一年的证书
    openssl x509 -req -in certs/$USER_NAME/$USER_NAME.csr -CA $CA_CRT_PATH -CAkey $CA_KEY_PATH \
    -CAcreateserial -out certs/$USER_NAME/$USER_NAME.crt -days $CRT_DAYS
    
    # 存放 kubectl config 的文件
    KUBECONFIG=$USER_NAME.conf
     
    # 设置 cluster
    kubectl config set-cluster $CLUSTER --server="$KUBE_URL" \
    --certificate-authority="$CA_CRT_PATH" --embed-certs=true --kubeconfig=$KUBECONFIG
     
    # 设置私钥以及已签名证书
    kubectl config set-credentials $USER_NAME --client-certificate=certs/$USER_NAME/$USER_NAME.crt \
    --client-key=certs/$USER_NAME/$USER_NAME.key --embed-certs=true --kubeconfig=$KUBECONFIG
     
    # 设置 context
    kubectl config set-context $USER_NAME-context --cluster=$CLUSTER --user=$USER_NAME --namespace=$DEFAULT_NAMESPACE --kubeconfig=$KUBECONFIG
    kubectl config use-context $USER_NAME-context --kubeconfig=$KUBECONFIG
     
    # 根据 namespace-controller-token-*** 生成 dashboard token
    SECRET_NAME=$(kubectl get secret -n kube-system -o go-template --template='{{range.items}}{{printf "%s\n" .metadata.name}}{{end}}' | grep namespace-controller-token)
    DASH_TOCKEN=$(kubectl get secret -n kube-system $SECRET_NAME -o jsonpath={.data.token}|base64 -d)
     
    # 设置 dashboard token
    kubectl config set-credentials $USER_NAME --token=$DASH_TOCKEN --kubeconfig=$KUBECONFIG
     
    # 添加 clusterrolebinding
    # 添加角色绑定到cluster-admin 添加角色具体参考k8s RBAC
    kubectl create clusterrolebinding $USER_NAME-cluster-admin --clusterrole cluster-admin --user $USER_NAME -n kube-system

     

参考

K8s Helm

相关环境

  • CentOS 7.6
  • K8s 1.16.2

Helm说明

  • 快速部署k8s资源的工具或者方式
  • 分成客户端和服务端

安装Helm

安装 Helm Client(Linux)

curl https://raw.githubusercontent.com/kubernetes/helm/master/scripts/get > get_helm.sh
chmod 700 get_helm.sh
./get_helm.sh
helm init --client-only

安装 Helm Client(Windows)

  • 管理员执行
    choco install kubernetes-helm
    helm init --client-only

     

安装 Helm 服务器端 Tiller

helm init
  • 由于某种不可抗力 上述命令可能会执行失败 请执行以下命令 初始化Helm
    helm init --upgrade --tiller-image registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.9.1 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

     

  • 输出以下信息表示,第一次Init Helm的版本是v2.16.1 第二次Init Helm的版本是v2.9.1
    Error: error when upgrading: current Tiller version gcr.io/kubernetes-helm/tiller:v2.16.1 is newer than client version registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.9.1, use --force-upgrade to downgrade

     

  • 重新初始化Helm
    helm init --upgrade --tiller-image registry.cn-hangzhou.aliyuncs.com/google_containers/tiller:v2.16.1 --stable-repo-url https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts

     

Tiller 授权

  • 创建 Kubernetes 的服务帐号和绑定角色
    kubectl create serviceaccount --namespace kube-system tiller
    kubectl create clusterrolebinding tiller-cluster-rule --clusterrole=cluster-admin --serviceaccount=kube-system:tiller

     

  • 为 Tiller 设置帐号
    kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'

     

  • 查看是否授权成功
    kubectl get deploy --namespace kube-system   tiller-deploy  --output yaml|grep  serviceAccount

     

  • 验证 Tiller 是否安装成功 详细参考Helm 入门指南

Helm使用

Helm add repo 添加Helm仓库

  • 安装 Helm Client
  • 执行 helm repo list
  • 添加Helm repo
    helm repo add --username=*** --password==*** --ca-file [crt文件] [仓库名] [仓库地址]

     

  • helm repo list 查询helm仓库
  • 仓库地址是HTTPS 需要crt文件

问题记录

  • 前提 使用root账号安装Helm Client 使用user账号 Helm add repo
    helm repo add --username=*** --password==*** --ca-file hub.iubang.com.crt xcloud https://hub.iubang.com:5000/chartrepo/xcloud

     

  • 执行上述命令返回Error: open /home/user/.helm/repository/repositories.yaml: permission denied
    sudo helm repo add --username=*** --password==*** --ca-file hub.iubang.com.crt xcloud https://hub.iubang.com:5000/chartrepo/xcloud

     

  • 执行上述命令返回sudo: helm: command not found
  • 分别执行printenv PATHsudo printenv PATH 发现使用sudo和不使用sudo会导致不同的PATH
  • helm默认安装在/usr/local/bin下 正好不在sudo printenv PATHPath中 所以sudo helm ...返回sudo: helm: command not found
  • 因为需要修改/home/user/.helm/repository/repositories.yaml文件 必须有sudo 所以执行以下命令
    sudo /usr/local/bin/helm repo add --username=*** --password==*** --ca-file hub.iubang.com.crt xcloud https://hub.iubang.com:5000/chartrepo/xcloud

     

  • 执行上述命令返回返回Error: Couldn't load repositories file (/root/.helm/repository/repositories.yaml).
  • 重新指定.helm路径
  • 具体参考sudo提示command not found的问题
    sudo /usr/local/bin/helm repo add --username=*** --password=*** --ca-file hub.iubang.com.crt --home /home/user/.helm xcloud https://hub.iubang.com:5000/chartrepo/xcloud

     

  • 执行上述命令成功

Install Helm push 插件

  • Install Helm push 插件需要git
  • 安装git命令yum install git
    helm plugin install https://github.com/chartmuseum/helm-push

     

Helm 使用

  • helm repo update xcloud 更新远程仓库的内容到本地仓库
  • helm install xcloud/tms-services --name tms-services-dev 使用xcloud/tms-services最新版本部署应用 应用名为tms-services-dev
  • helm upgrade tms-services-dev xcloud/tms-services 使用xcloud/tms-services最新版本升级应用tms-services-dev`

参考

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐