【配置虚拟机】

一、下载ubuntu镜像

https://releases.ubuntu.com/20.04/

二、用Vmware加载ubuntu镜像,配置如下

新增一个host-only网卡
在这里插入图片描述

$ sudo passwd 可以修改管理员密码,在管理员账号下进行以下操作

三、VM network配置(/etc/netplan/*****.yaml)

network:
  ethernets:

     ens35:
         addresses: [192.168.34.41/24]
         dhcp4: no
         gateway4: 192.168.34.1
         nameservers:
                 addresses: [192.168.34.1,114.114.114.114]
  version: 2
  renderer: NetworkManager

重载下网络:

$ netplan apply

在这里插入图片描述
在这里插入图片描述

四、关闭swap

$ swapoff -a
$ vi /etc/fstab

将swap行的信息注释掉
在这里插入图片描述

【docker安装】

一、安装docker

$ apt install docker.io

二、将docker的cgroupdriver设置为systemd

$ vi /etc/docker/daemon.json
{
  "exec-opts": ["native.cgroupdriver=systemd"]
}
$ systemctl daemon-reload
$ systemctl restart docker

【k8s安装】

参考: 官方文档

一、允许 iptables 检查桥接流量
$ cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
br_netfilter
EOF

$ cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
$ sudo sysctl --system
二、更新apt 包的索引,并安装使用k8s的apt仓库依赖包
$ sudo apt-get update
$ sudo apt-get install -y apt-transport-https ca-certificates curl
三、kubeadm安装GPG证书
$ sudo curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
四、添加kubernetes的 apt 仓库
$ sudo tee /etc/apt/sources.list.d/kubernetes.list <<-'EOF'
deb https://mirrors.aliyun.com/kubernetes/apt kubernetes-xenial main
EOF
五、更新apt 包的索引,安装指定版本的kubelet、kubeadm、kubectl
$ sudo apt-get update
$ sudo apt-get install -y kubelet=1.22.2 kubeadm=1.22.2 kubectl=1.22.2  (注意:此条命令会失败,解决方法如下)
$ sudo apt-mark hold kubelet kubeadm kubectl
问题:指定的1.22.2版本提示不存在

在这里插入图片描述

解决方法:

1、查看版本库

$ apt-cache madison kubelet

在这里插入图片描述
2、重新指定版本为1.22.2-00即可

$ sudo apt-get install -y kubelet=1.22.2-00 kubeadm=1.22.2-00 kubectl=1.22.2-00

安装完成可以了查看到对应的版本信息
在这里插入图片描述

以上步骤在master和node节点都需要操作

以上步骤在master和node节点都需要操作

以上步骤在master和node节点都需要操作,node的网卡名需要按实际填写、ip需要自己分配

【使用 kubeadm 创建集群】

一、kubeadm init
$ echo "192.168.34.2 cncamp.com" >> /etc/hosts
$ kubeadm init \
 --image-repository registry.aliyuncs.com/google_containers \
 --kubernetes-version v1.22.2 \
 --pod-network-cidr=192.168.0.0/16 \
 --apiserver-advertise-address=192.168.34.2

pod cidr:
flannel 默认是10.244.0.0/16
calico 默认是192.168.0.0/16

二、复制kubeconfig,配置kubectl
$ mkdir -p $HOME/.kube
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config
三、控制平面节点隔离
$ kubectl taint nodes --all node-role.kubernetes.io/master-
四、安装Pod网络–calico cni plug

参考: calico文档

$ kubectl create -f https://docs.projectcalico.org/manifests/tigera-operator.yaml
$ kubectl create -f https://docs.projectcalico.org/manifests/custom-resources.yaml

【加入Node节点】

一、配置两个新虚机

在这里插入图片描述

运行上节第一点kubeadm init 安装后展示的命令

$ kubeadm join 192.168.34.2:6443 --token fgeqxw.hdvb68lgh4v3awqq \
	--discovery-token-ca-cert-hash sha256:7c6f049ae1e0fc84d23780519392639d1fc15e5aae858da2afde20e9e8dbd7c6

以上步骤完成即可成功配置k8s集群

【常用命令】

$ kubeadm token create --print-join-command
$ kubectl get pod --all-namespaces -owide
$ kubectl create deployment httpd-app --image=httpd --replicas=2
$ journalctl -f -u kubelet

$ systemctl status kubelet.service

$ kubectl drain node2 --delete-local-data
$ kubectl delete node node2

$ kubectl delete -f myjob.yml 





【以下内容参考自《每天5分钟玩转Kubernetes》】
  1. 用户通过kubectl 创建 Deployment
  2. Deployment 创建 ReplicaSet
  3. ReplicaSet 创建 Pod
$ kubectl create deployment nginx-deployment --image=nginx:1.7.9 --replicas=2

$ kubectl   get    deployment nginx-deployment
$ kubectl describe deployment nginx-deployment

$ kubectl   get    replicaset
$ kubectl describe replicaset nginx-deployment-84b896cf65

$ kubectl   get    pod
$ kubectl describe pod nginx-deployment-84b896cf65-4pznq

【Kubernetes 支持两种创建资源的方式】

一、命令
kubectl create …
二、配置文件
kubectl apply -f nginx.yaml
kubectl delete -f nginx.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx

【用label指定pod在哪个node上生成】

1) 先给node1打label

$ kubectl label node node1 disktype=ssd
$ kubectl get node --show-labels

2) 编辑yaml文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx
      nodeSelector:
          disktype: ssd

3) 删除label disktype

$ kubectl label node node1 disktype-

【DaemonSet】

1)DaemonSet的不同之处在于: 每个Node上最多只能运行一个副本

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: nginx-ds
spec:
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
        - name: nginx
          image: nginx

【Job】 工作类容器(有别于管理服务类容器),用于一次性任务,完成后容器就退出

apiVersion: batch/v1
kind: Job
metadata:
  name: pi
spec:
  parallelism: 1
  completions: 5
  template:
    spec:
      containers:
        - name: pi
          image: perl
          command: ["perl",  "-Mbignum=bpi", "-wle", "print bpi(2000)"]
      restartPolicy: OnFailure
  backoffLimit: 4

restartPolilcy:
1)Never 代表失败会一直新建新的pod,直到成功
2)OnFailure 代表失败会在原pod上进行restart,直到成功

parallelism:
1)并行运行该pod的数量

【通过service访问pod】

通过labels和selector,将service和pod绑定

apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpd
spec:
  replicas: 3
  selector:
    matchLabels:
      run: httpd
  template:
    metadata:
      labels:
        run: httpd
    spec:
      containers:
      - name: httpd
        image: httpd
        ports:
        - containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: httpd-svc
  labels:
    run: httpd
spec:
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 80
  selector:
    run: httpd

apply 之后,可以通过kubectl get service取到service的clusterip,通过该ip:8080,即可访问到pod。
通过 kubectl describe service httpd-svc 可以查看httpd-svc与Pod的对应关系。

【外网如何访问Service】

其中一种方式是NodePort。
Cluster外部通过:访问Service。

$ httd-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: httpd-svc
  labels:
    run: httpd
spec:
  type: NodePort
  ports:
    - protocol: TCP
      port: 8080
      targetPort: 80
  selector:
    run: httpd

其中type:NodePort。
Kubernetes会从30000~32767中随机分配一个可用的端口,每个节点都会监听该端口并将请求转发给Service。

我们也可以指定nodePort的端口号:

apiVersion: v1
kind: Service
metadata:
  name: httpd-svc
  labels:
    run: httpd
spec:
  type: NodePort
  ports:
    - protocol: TCP
      nodePort: 30000
      port: 8080
      targetPort: 80
  selector:
    run: httpd

nodePort是节点上监听的端口;
port是Cluster上监听的端口;
targetPort是Pod监听的端口。
最终,Node和ClusterIP在各自端口上接收到的请求都会通过iptables转发到Pod的targetPort。

【Rolling Update】

$ cat httpd.yml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpd
spec:
  replicas: 3
  selector:
    matchLabels:
      run: httpd
  template:
    metadata:
      labels:
        run: httpd
    spec:
      containers:
        - name: httpd
          image: httpd:2.2.31
          ports:
          - containerPort: 80

apply2.2.31版本,通过以下命令可以查看2.2.31版本的信息

$ kubectl get deployment httpd -owide
$ kubectl get replicaset -owide

滚动升级,只需将yml文件中httpd:2.2.31改为httpd:2.2.32,再次apply即可。
通过kubectl describe deployment httpd可以查看滚动升级的过程,31版本的pod逐个减少,32版本的pod逐个新增。
maxSurge、maxUnavailable这两个参数用于Pod的替换数量。

【回滚】

有httpd镜像的2.4.16、2.4.17、2.4.18三个版本,在apply时加上参数 --record,将当前命令记录到revision中。
通过kubectl rollout deployment httpd查看revision历史记录。
执行kubectl rollout undo deployment httpd --to-revision=1 可以回滚到对应历史记录的版本。
再次执行kubectl rollout deployment httpd可以看到对应的变化,revision 1 变到了 revision 4。

【Health Check】

Liveness探测 Vs Readiness探测
Liveness探测判断容器是否需要重启以实现自愈,Readiness探测用于判断容器是否已经能够对外提供服务。

Liveness探测,连续三次探测失败,会杀掉并重启容器。

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness
spec:
  restartPolicy: OnFailure
  containers:
  - name: liveness
    image: busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
    livenessProbe:
      exec:
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 10
      periodSeconds: 5

Readiness探测(liveness替换为readiness),连续三次探测失败,直接将READY设置为不可用。

apiVersion: v1
kind: Pod
metadata:
  labels:
    test: readiness
  name: readiness
spec:
  restartPolicy: OnFailure
  containers:
    - name: readiness
      image: busybox
      args:
        - /bin/sh
        - -c
        - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600
      readinessProbe:
        exec:
          command:
            - cat
            - /tmp/healthy
        initialDelaySeconds: 10
        periodSeconds: 5

【Health Check 在 Scale Up中的应用】

readinessProbe:
  httpGet:
    scheme: HTTP
    path: /healthy
    port: 8080
  initialDelaySecondes: 10
  periodSeconds: 5

探测方法为httpGet,不同于exec。探测成功的判断条件是http请求的返回代码在200~400之间。
探测成功会加入到web-svc的负载均衡中,开始处理客户请求。
每5s探测一次,如果连续3次失败,容器会从负载均衡中被移除,直到下次探测成功重新加入。

【Health Check 在滚动更新中的应用】

repicas: 10

当滚动的版本有问题时,会出现该情况:desired 10,current 13,up-to-date 5,available 8。
数值由maxSurge、maxUnavailable控制。
副本总数最大值13,由默认maxSurge为25%计算得出。(10+10·25%)百分比向上取整,得13。
可用副本数为8,由默认maxUnavailable为25%计算得出。(10-10·25%)百分比向下取整,得8。
也可以自定义这两个参数

strategy:
  rollingUpdate:
    maxSurge: 35%
    maxUnavailable: 35%

【Volume】

1、emptyDir

kind: Pod
.
.
.
volumes:
- name: shared-volume
  emptyDir: {}

emptyDir Volume的生命周期与 Pod 一致。
创建后会在Host上新建一个临时的目录,当Pod不存在了,emptyDir也就没有了。
emptyDir特别适合Pod中的容器需要临时共享存储空间的场景。

2、hostPath
持久性比emptyDir强。如果Pod被销毁了,hostPath对应的目录不会消失。
不过一旦Pod被销毁,hostPath也无法访问

【PersistentVolume & PersistentVolumeClaim】

即PV和PVC。
PV具有持久性,生命周期独立于Pod,由管理员创建和维护。
PVC是对PV的申请,由普通用户创建和维护。

1、NFS PersistentVolume

kubectl get pv
kubectl get pvc

2、回收PV

kubectl delete pvc mypvc1

因为设置的PV回收策略为Recycle,所以数据都会被清除,当PVC mypvc1被删除后,Kubernetes会启动一个新Pod recycler-for-mypvc1,进行清除PV mypv1上的数据。
回收策略可以修改为Retain,则不会对PV上的数据进行清除。

3、PV 动态供给
1、StorageClass standard

kind: StorageClass
...
metadata:
  name: standard

2、StorageClass slow

kind: StorageClass
...
metadata: slow

以上两个StorageClass都会动态创建AWS EBS,不同点在于standard创建的是gp2类型的EBS,而slow创建的是io1类型的EBS。
StorageClass支持Delete和Retain两种reclaimPolicy,默认是Delete。

【Secret & Configmap】

1、Secret

密码、私钥、Token不适合直接存放在容器中,所以采用Secret来为Pod提供这些敏感信息。
创建方式有四种:
1)通过 --from-literal:

kubectl create secret generic mysecret --from-literal=username=admin
--from-literal=password=123456   

2)通过 --from-file:

echo -n admin > ./username
echo -n 123456 > ./password
kubectl create secret generic mysecret --from-file=./username
--from-file=./password

3)通过 --from-env-file。
4)通过YAML配置文件。
在Pod中使用Secret
1、Volume方式
2、环境变量方式

2、Configmap

非敏感数据,比如应用的配置信息,就可以用Configmap。

【Helm——Kubernetes的包管理器】

Helm解决了Kubernetes缺少一个更高层次的应用打包工具的问题。
举例:
对于一个Mysql服务,Kubernetes需要部署下面这些对象:
1、Service,让外界能够访问到Mysql;
2、Secret,定义Mysql的密码;
3、PersistentVolumeClaim,为Mysql提供持久化存储空间;
4、Deployment,部署Mysql Pod,并使用上面的这些支持对象。
以上配置可以写进一个配置文件,通过apply 统一部署。
但是对于微服务架构的应用,有几十上百个服务,则不好组织和管理,例如用到两个Mysql服务,配置参数不同,则需要复制多一套Mysql配置文件进行部署,也就是不支持参数化配置和多环境部署。等等。
1、Helm架构
两个概念:chart和release。
chart可以理解为apt、yum中的软件安装包;
release是chart的运行实例。

1、安装Helm
1)Helm客户端
(:参考
Helm安装
Helm安装2

curl https://baltocdn.com/helm/signing.asc | sudo apt-key add -
sudo apt-get install apt-transport-https --yes
echo "deb https://baltocdn.com/helm/stable/debian/ all main" | sudo tee /etc/apt/sources.list.d/helm-stable-debian.list
sudo apt-get update
sudo apt-get install helm

【Kubernetes Dashboard】

1、安装
😃 参考
Dashiboard安装

【Kubernetes 集群监控】

1、Weave Scope
安装
😦 参考
Weave Scope安装 之3.2 K8s 资源文件部署

2、Prometheus Operator
安装
😐 参考
Prometheus Operator安装

Logo

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

更多推荐