分类目录归档:K8S

VT102图形测试whiptail

#!/bin/bash

whiptail --title "K8s,  Vision @ 2019" --menu "Choose your option" 20 65 13 \
"1" "Single K8s One-click" \
"2" "Cluste K8s One-click" \
"3" "Cluste K8s add node" \
"4" "Single K8s add node" \
"5" "del node" \
"6" "Uninstall K8s" \
"7" "Quit"  3>&1 1>&2 2>&3
#!/bin/bash
whiptail --title "导入集群IP地址(包含本机ip默认第一个ip对应本机ip作为master)" --yes-button "YES" --no-button "NO"  --yesno "批量导入集群IP地址?" 10 60
#!/bin/bash
whiptail --title "#请输入本机Ip(master)并回车#" --inputbox "请检查IP是否一致,确定提交?" 10 60 "$IP" 3>&1 1>&2 2>&3
#!/bin/bash
#---
if ( whiptail --title "Title hylan:yesno" --yesno "Choose between Yes and No." 10 60 ) then
     echo "You chose Yes. Exit status was $?."
else
     echo "You chose No. Exit status was $?."
fi
#---
if (whiptail --title "Title hylan:yesno" --yes-button "Hylan" --no-button "Candy"  --yesno "Which do you like better?" 10 60) then  
   echo "You chose Hylan. Exit status was $?."; 
   echo "You Best!"
else    
   echo "You chose Candy. Exit status was $?.";
fi
#---
whiptail --title "Title hylan:msgbox" --msgbox "Create a message box with whiptail. Choose Ok to continue." 10 60
#---
whiptail --title "Title hylan:inputbox" --inputbox "What is your pet's name?" 10 60 hylancandy 3>&1 1>&2 2>&3
#---
whiptail --title "Title hylan:passwordbox" --passwordbox "Enter your password and choose Ok to continue." 10 60 3>&1 1>&2 2>&3
#---
whiptail --title "Title hylan:menu" --menu "Choose your option" 15 60 4 \
"1" "Grilled Spicy Sausage" \
"2" "Grilled Halloumi Cheese" \
"3" "Charcoaled Chicken Wings" \
"4" "Fried Aubergine"  3>&1 1>&2 2>&3

#---
whiptail --title "Title hylan:checklist" --checklist "Choose preferred Linux distros" 15 60 4 "debian" "Venerable Debian" ON "ubuntu" "Popular Ubuntu" OFF "centos" "Stable CentOS" ON "mint" "Rising Star Mint" OFF 3>&1 1>&2 2>&3

{
     for (( i=0 ; i<=100 ; i+=20 )); do
         sleep 1
         echo $i
     done
} | whiptail --gauge "Please wait while installing" 6 60 0

#---
whiptail --title "Title hylan:checklist" --radiolist "Choose preferred Linux distros" 15 60 4 "debian" "Venerable Debian" ON "ubuntu" "Popular Ubuntu" OFF "centos" "Stable CentOS" ON "mint" "Rising Star Mint" OFF 3>&1 1>&2 2>&3

快速构建istio的测试容器

第一步:以nginx的容器为测试
build.sh脚本内容如下。

#!/bin/sh

path_current=`pwd`
path_script=$(cd "$(dirname "$0")"; pwd)

ver=$1
if [ "$ver" == "" ]; then
   echo "should like: build.sh v2"
   exit
fi

docker rmi ngtest:${ver}
docker stop mynginx
docker rm mynginx
docker run --name mynginx -d nginx:1.17.8
docker cp ./default.conf mynginx:/etc/nginx/conf.d/default.conf && docker commit mynginx ngtest:${ver}
docker stop mynginx
docker rm mynginx
echo "----------------list ngtest image---------------------"&&docker images|grep ngtest

与脚本同级目录下的default.conf配置文件如下:

server {
    listen       80;
    listen  [::]:80;
    server_name  localhost;

    location /test {
        default_type application/json;
        return 200 "vm4 - v2 - time:$date_gmt - remote:$remote_addr";
    }

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

第二步:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: ngtest-gateway
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "mynginx.cn"
-----------------------------------------
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ngtest
spec:
  hosts:
  - "ngtestsvc"
  gateways:
  - ngtest-gateway
  http:
  - match:
    - uri:
        prefix: /
    route:
    - destination:
        host: ngtestsvc
        port:
          number: 1080
        subset: v1
      weight: 90
    - destination:
        host: ngtestsvc
        port:
          number: 1080
        subset: v2
      weight: 10

---------------------
apiVersion: v1
kind: Service
metadata:
  name: ngtestsvc
spec:
  type: NodePort
  ports:
  - port: 1080
    targetPort: 80
    name: http
  selector:
    app: ngtestapp

-------------------------------------
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ngtestapp.v1
spec:
  replicas: 3
  selector:
    matchLabels:
      app: ngtestapp
      version: v1
  template:
    metadata:
      labels:
        app: ngtestapp
        version: v1
    spec:
      containers:
      - name: ngtest
        image: ngtest:v1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        env:
        - name: DO_NOT_ENCRYPT
          value: "true"

------------------------------------
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ngtestapp.v2
spec:
  replicas: 3
  selector:
    matchLabels:
      app: ngtestapp
      version: v2
  template:
    metadata:
      labels:
        app: ngtestapp
        version: v2
    spec:
      containers:
      - name: ngtest
        image: ngtest:v2
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        env:
        - name: DO_NOT_ENCRYPT
          value: "true"

service的三种类型

Kubernetes的service有三种类型:ClusterIP,NodePort,LoadBalancer

apiVersion: v1
kind: Service
metadata:
  name: ngtestsvc
spec:
  type: NodePort  【不指定,默认为ClusterIP】
  ports:
  - port: 1080
    targetPort: 80  【不指定时,默认与port一致】
    #nodePort: 31080 【该端口被强制划分为30000~50000之间,建议由系统自动分配,因为它会产生冲突的。】
    name: http
  selector:
    app: ngtestapp

安装ISTIO-1.6.8版本

承接上K8s的安装教程,继续安装ISTIO。

K8s离线版本安装全过程


因为ISTIO具备完整的监控,包括grafana/prometheus等,故需要先删除原集群的相关监控,然后按istio方式部署。
第一步:检查目标K8s是否满足安装istio的条件。

istio x precheck

第二步:安装示范DEMO

istioctl install --set profile=demo
安装结束后,可用命令检查是否安装完整
 istioctl verify-install

K8s离线版本安装全过程

本人克隆了一份:https://gitee.com/kxtry/K8s
原来开源位置:https://gitee.com/q7104475/K8s
本人环境配置:
Master节点 : 172.16.3.244
工作节点 : 172.16.3.245 172.16.3.248
必须保证所有节点密码一致,且以root帐号运行。
第一步:下载离线包:

本人百度云盘:
链接:https://pan.baidu.com/s/1Dok1vqn8G0AhUkl_l12e6Q 
提取码:09cu 
或者去开源仓库下载:http://www.linuxtools.cn:42344/K8s_1.3.2.tar
http://www.linuxtools.cn:42344/目录下,有很多宝贝。
http://www.linuxtools.cn:42344/K8s_list/是K8s离线下载包。

第二步:上传至master机【如果master多台,则只需要上传其中一台就可以了,但必须是master的节点,其它节点执行脚本,会出部署故障。】
第三步:进入解压K8s目录【这个目录不能修改,修改为其它可能会有问题】,执行install.sh脚本。
第四步:选择”Cluster K8s One-click”项。

第五步:确认导入集群IP列表


注:默认第一个IP为Master-1。
第六步:选择集群FS,选择NFS模式,【不要选择GlusterFS类型,因为其要求挂载没有格式化的磁盘】

第七步:输入Root密码【集群中每台主机的root帐号密码都必须一致】

第八步:再次确认MasterIP

第九步:大约10分钟的安装等待
因为它是采用ansible推送的方式安装,它是会主动连接每台主机,把当前解压包内的相关文件推送至相关集群机上安装
第十步:安装完成,提示相关服务的访问方式

第十一步:检查服务健康状态和清理安装临时文件,这步骤所有安装执行完毕。
———————————————————————————-
在1.3.2离线安装包上,会存在NFS没有正确安装的情况,故需要手动再补一刀,如下情况所示:

解决方法:

sh  /root/K8s/nfs/nfs_install.sh


———————————————————————————
因为本离线kubectl已经赋加相关权限,故没有安装其它应用如ISTIO,是不需要生成admin.kubeconfig配置的。
但有部分应用可能引用~/.kube/config,也即admin.kubeconfig配置,故可按以下方式生成。
vim generate_admin_kubeconfig.sh文件

#!/bin/sh
MASTER_IP=$1
if [ "${MASTER_IP}" == "" ];then
   echo "should add master ip parameter"
   exit
fi

cd /etc/kubernetes/ssl
cat > admin-csr.json  <<  'EOF'
{
    "CN": "admin",
    "hosts": [],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "ST": "beijing",
            "L": "beijing",
            "O": "od",
            "OU": "ops"
        }
    ]
}
EOF

cfssl_linux-amd64 gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson_linux-amd64 -bare admin

#生成集群配置文件
kubectl config set-cluster myk8s \
--certificate-authority=/etc/kubernetes/ssl/ca.pem \
--embed-certs=true \
--server=https://${MASTER_IP}:6443 \
--kubeconfig=kube-admin.kubeconfig

# 设置admin管理账号
kubectl config set-credentials admin \
--client-certificate=/etc/kubernetes/ssl/admin.pem \
--client-key=/etc/kubernetes/ssl/admin-key.pem \
--embed-certs=true \
--kubeconfig=kube-admin.kubeconfig

#绑定账号和管理的集群
kubectl config set-context myk8s-context \
--cluster=myk8s \
--user=admin \
--kubeconfig=kube-admin.kubeconfig

#选择指定集群 一般在需要远程控制的机器上操作
kubectl config use-context myk8s-context --kubeconfig=kube-admin.kubeconfig

#绑定账号到指定的角色
cat  >  k8s-admin.yaml  << 'EOF'
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: admin
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: User
  name: admin
EOF

kubectl apply -f k8s-admin.yaml
kubectl get clusterrolebinding  admin   -o yaml

cp kube-admin.kubeconfig ~/.kube/config -f

K8s安装过程

通过kubespray实现k8s的安装记录【https://github.com/kubernetes-sigs/kubespray】。
所使用的分支是release-2.11。\
——————kubespray加速方案—————-
https://github.com/wiselyman/k8s-installation
https://blog.csdn.net/zhouzixin053/article/details/104418164

烂泥:docker.io、gcr.io、quay.io镜像加速(20200413更新)


—————–禁用IPV6————————-
以下是Centos7.8的祼系统的安装部署过程。
操作前必须禁用IPV6,否则在安装docker等默认使用ipv6连接。
如下图:

彻底禁用IPV6方法:http://www.kxtry.com/archives/3044

——————————————
虚拟机配置:2核4G, IP: 192.168.10.130 192.168.10.134
第一步:在执行kubespray脚本前的环境准备,从release-2.11这个版本,默认是使用python3来安装了,故需要安装python3。
注:请不要使用python2进行安装,本人经验证确认在执行【CONFIG_FILE=inventory/myk8s/hosts.yml python3 contrib/inventory_builder/inventory.py ${IPS[@]}】动作时,会出错,且无法解决。

1.yum install -y python3 python3-pip python3-devel
2.mkdir -p ~/.pip/ && vi ~/.pip/pip.conf,添加如下内容:
[global]
index-url=http://mirrors.aliyun.com/pypi/simple    【尽量不要使用https的源,有可能某些源会严格检查SSL是否过期之类,从而导致安装出错】
trusted-host=mirrors.aliyun.com

第二步:配置服务器免密互信

ssh-keygen -t rsa -C "abc@admin.com"
ssh-copy-id 192.168.10.130

第三步,安装必须组件。

1.pip3 install -r requirements.txt

直至最后提示以下成功信息

第三步:进入kubespray的release-2.11分支安装单机版本。

mkdir inventory/myk8s
declare -a IPS=(192.168.10.137 192.168.10.138) 【这里是空格隔开,不是逗号】
CONFIG_FILE=inventory/myk8s/hosts.yml python3 contrib/inventory_builder/inventory.py ${IPS[@]}
ansible-playbook -i inventory/myk8s/hosts.yml --become --become-user=root cluster.yml  -vvv --flush-cache【-vvv是显示安装细节过程,--flush-cache是清理操作缓存】

—————————-
加快安装效率及降低翻墙影响,可直接下载K8s离线包。
http://linuxtools.cn:42344/K8s_list/

istio的sidecar注入原理

博文:https://zhaohuabing.com/2018/05/23/istio-auto-injection-with-webhook/
从k8s 1.9版本以来,引入AdmissionWebhook扩展机制,允许对ApiServer创建资源的进行验证及修改。

从图中看到,Admission中有两个重要的阶段,Mutation和Validation,这两个阶段中执行的逻辑如下:
Mutation
Mutation是英文“突变”的意思,从字面上可以知道在Mutation阶段可以对请求内容进行修改。
Validation
在Validation阶段不允许修改请求内容,但可以根据请求的内容判断是继续执行该请求还是拒绝该请求。
通过Admission webhook,可以加入Mutation和Validation两种类型的webhook插件,这些插件和Kubernets提供的预编译的Admission插件具有相同的能力。可以想到的用途包括:
修改资源。例如Istio就通过Admin Webhook在Pod资源中增加了Envoy sidecar容器。
自定义校验逻辑,例如对资源名称有一些特殊要求。或者对自定义资源的合法性进行校验。