记k8s集群部署
记一次k8s部署
【配置虚拟机】
一、下载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》】
- 用户通过kubectl 创建 Deployment
- Deployment 创建 ReplicaSet
- 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安装
更多推荐
所有评论(0)