关闭节点的selinux和iptables防火墙
yum install -y docker-ce
注意:这是我自己搭建的docker-ce仓库,直接将上图红圈中的软件包放到了docker仓库中构建的,如果是阿里云或清华镜像,可能会提示缺少该依赖,需要自己去网上下载(可在阿里云搜索下载的)。
vim /etc/sysctl.d/k8s.conf
sysctl --system
systemctl enable --now docker.service
官网:https://kubernetes.io/docs/setup/production-environment/container-runtimes/#docker
vim /etc/docker/daemon.json
1 {
2 "exec-opts": ["native.cgroupdriver=systemd"],
3 "log-driver": "json-file",
4 "log-opts": {
5 "max-size": "100m"
6 },
7 "storage-driver": "overlay2",
8 "storage-opts": [
9 "overlay2.override_kernel_check=true"
10 ]
11 }
mkdir -p /etc/systemd/system/docker.service.d
systemctl daemon-reload
systemctl restart docker
swapoff -a
vim /etc/fstab ##注释掉/etc/fstab文件中的swap定义
vim /etc/yum.repos.d/k8s.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=0
yum install -y kubelet kubeadm kubectl
systemctl enable --now kubelet
主节点(server1):
查看默认配置信息
kubeadm config print init-defaults
默认从k8s.gcr.io上下载组件镜像,需要才可以,所以需要修改镜像仓库:
列出所需镜像
kubeadm config images list --image-repository registry.aliyuncs.com/google_containers
拉取镜像
kbeadm config images pull --image-repository registry.aliyuncs.com/google_containersu
报错,因为我的k8s是最新的1.18.4,而远程仓库没更新,所以报错
指定安装1.18.3 --kubernetes-version指定k8s安装版本
kubeadm config images pull \
--image-repository registry.aliyuncs.com/google_containers \
--kubernetes-version v1.18.3
将镜像上传到harbor仓库,如何创建私有仓库可以看我上一篇文章
在harbor主机将证书传给server1
scp reg.harbor.com.crt 192.168.1.101:/etc/docker/certs.d/reg.harbor.com/ca.crt
然后再server1进行认证
docker login reg.harbor.com
将刚才我们从外网拉取的镜像上传到私有harbor仓库
for i in `docker images | grep registry | awk '{ print $1":"$2 }' | awk -F '/' '{ print $3 }'`;do
> docker tag registry.aliyuncs.com/google_containers/$i reg.harbor.com/library/$i;
> docker push reg.harbor.com/library/$i
> done
登陆harbor仓库查看
在server1删除阿里云仓库镜像,只保留私有仓库镜像
for i in `docker images | grep registry.aliyuncs.com | awk '{ print $1":"$2 }'`; do docker rmi $i; done
使用flannel网络组件时必须添加--pod-network-cidr=10.244.0.0/16
kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository reg.harbor.com/library
提示虚拟机是单核的,可以通过添加--ignore-preflight-errors=参数解决
kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository reg.harbor.com/library --ignore-preflight-errors=NumCPU
报错,找不到版本1.18.4,默认是找软件版本,和我们实际版本不一致,指定版本 --kubernetes-version v1.18.3
kubeadm init --pod-network-cidr=10.244.0.0/16 --image-repository reg.harbor.com/library --kubernetes-version v1.18.3 --ignore-preflight-errors=NumCPU
mkdir -p $HOME/.kube
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
kubectl get node ##配置完成后查看节点
kubectl get all
上面我使用的是root用户,实际环境可以创建普通用户,然后通过sudo授权,关键在于/etc/kubernetes/admin.conf文件
kubeadm join 192.168.1.101:6443 --token 0m1udt.sae7k0ubqkz7pww4 \
--discovery-token-ca-cert-hash sha256:26340cffec9e7db18af86ca5238a8132ee81229f412a86fcb0f82e8ec627e562
上图是我们初始化成功时最后系统打印的信息,将红框部分内容在其他节点运行(server2,server3)
注意,这里的token会过期(默认24小时)过期后其他节点要加入时需要生成新的token
kubeadm token create
配置kubectl命令补齐功能:
echo "source <(kubectl completion bash)" >> ~/.bashrc
source ~/.bashrc
可以查看下状态,如果node节点notready可以查看日志,这是我参考别人的文章https://www.cnblogs.com/lph970417/p/11805934.html
其次因为我忘记做harbor解析,导致之后的pod状态一致不对,去查看server2、3节点发现拉取镜像失败,因为没做解析以及https的自签名证书问题
https://github.com/coreos/flannel
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml ###肯能会因为网络问题失败,多执行几次,我执行了十几次才成功
• 其他网络组件:
• https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/create-
cluster-kubeadm/#pod-network
Master查看状态:
kubectl get cs
kubectl get nodes
kubectl get pod -n kube-system
kubectl命令指南:
• https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands
kubectl命令: https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands
准备:
拉取nginx镜像,上传到私有harbor仓库
docker pull hub.c.163.com/library/nginx:latest
docker tag hub.c.163.com/library/nginx reg.harbor.com/library/nginx
docker push reg.harbor.com/library/nginx
删除镜像
docker rmi hub.c.163.com/library/nginx
创建Pod应用
kubectl run nginx --image=nginx --replicas=2 --record
本来这里是server3也会创建pod应用的,但因为replicas参数已经被弃用,所以不会生效,最终只是再server3创建pod应用后面我们可以通过资源清单的方式批量部署pod应用
• 集群内部任意节点可以访问Pod,但集群外部无法直接访问。
删除Pod
kubectl delete pod nginx
service是一个抽象概念,定义了一个服务的多个pod逻辑合集和访问pod的策略,一般把service称为微服务。
创建service
kubectl expose pod nginx --port=80 --target-port=80
• 此时pod客户端可以通过service的名称访问后端Pod
• ClusterIP: 默认类型,自动分配一个仅集群内部可以访问的虚拟IP
使用NodePort类型暴露端口,让外部客户端访问Pod
kubectl edit svc nginx //修改service的type为NodePort
kubectl expose deployment nginx --port=80 --target-port=80 --type=NodePort //也可以在创建service时指定类型
• NodePort: 在ClusterIP基础上为Service在每台机器上绑定一个端口,这样就可以通过 NodeIP:NodePort 来访问该服务
更新pod镜像
kubectl set image deployment nginx nginx=nginx:1.16.0 --record
回滚
kubectl rollout history deployment nginx ##查看历史版本
kubectl rollout undo deployment nginx --to-revision=1 ##回滚版本
kubectl explain pod ##查询帮助文档
自主式Pod资源清单
vim demo.yaml
kubectl create -f demo.yaml
标签:
kubectl get pod --show-labels ##查看标签
kubectl get pod -l app ##过滤包含app的标签
kubectl get pod -L app
kubectl label pod demo version=v1 ##打标签
kubectl label pod demo app=demo-nginx --overwrite ##更改标签
节点标签选择器
kubectl label nodes server3 disktype=nvme-ssd
kubectl get nodes -l disktype
在yaml文件中增加标签选择器
kubectl delete -f demo.yml
kubectl create -f demo.yaml
kubectl get pod -o wide
kubectl label nodes server2 disktype=hdd
vim demo.yaml
Pod 可以包含多个容器,应用运行在这些容器里面,同时 Pod 也可以有一个或多个先于应用容器启动的 Init 容器。
Init 容器与普通的容器非常像,除了如下几点:
如果 Pod 的 Init 容器失败,Kubernetes 会不断地重启该 Pod,直到 Init 容器成功为止。然而,如果 Pod 对应的 restartPolicy 值为 Never,它不会重新启动。
Init 容器能做什么?
准备:
下载busybox镜像推送到私有harbor仓库
编辑yaml文件
kubectl create -f demo2.yaml
kubectl get -f demo2.yaml
kubectl describe -f demo2.yaml
kubectl create -f myservice.yaml
这里应该是running,发现还没有初始化,查看具体情况
kubectl describe -f demo2.yaml
这里提示是我的server2网络配置有问题,删除server2的cni0网卡,重建
ifconfig cni0 down
ip link delete cni0
ifconfig cni0 up
kubectl get -f demo2.yaml
初始化完成
探针是由 kubelet 对容器执行的定期诊断:
每次探测都将获得以下三种结果之一:
Kubelet 可以选择是否执行在容器上运行的三种探针执行和做出反应:
重启策略
Pod 的生命
liveness实例
Pod 的分类:
控制器类型:
Replication Controller和ReplicaSet
Deployment
DaemonSet
StatefulSet
Job
CronJob
HPA
ReplicaSet控制器
Deployment控制器
缩容
kubectl scale deployment deployment-nginx --replicas=2 --record
更新
kubectl set image deployment deployment-nginx nginx=nginx:v1 --record
查看历史版本
kubectl rollout history deployment
回滚
kubectl rollout undo deployment deployment-nginx --to-revision=1
回滚状态
kubectl rollout status deployment deployment-nginx
DaemonSet控制器
Job控制器
cronjob
kubectl create -f cronjob-test.yaml
kubectl get cronjobs.batch
kubectl get pod
kubectl logs cronjob-example-1593150780-vg4lj
开启kube-proxy的ipvs模式:
所有节点安装
yum install -y ipvsadm
修改IPVS模式
kubectl edit cm kube-proxy -n kube-system
更新kube-proxy pod
kubectl get pod -n kube-system |grep kube-proxy | awk '{system("kubectl delete pod "$1" -n kube-system")}'
IPVS模式下,kube-proxy会在service创建后,在宿主机上添加一个虚拟网卡: kube-ipvs0,并分配service IP。
ifconfig kube-ipvs0
kube-proxy通过linux的IPVS模块,以rr轮询方式调度service中的Pod。
Flannel vxlan模式跨主机通信原理
创建service:(ClusterIP方式)
vim service-test.yaml
kubectl create -f service-test.yaml
kubectl describe service web-service
Kubernetes 提供了一个 DNS 插件 Service
kubectl get services kube-dns --namespace=kube-system
kubectl run test --image=busyboxplus -it
Headless Service “无头服务”
Headless Service 示例:
yum install -y bind-utils-9.9.4-72.el7.x86_64
dig -t A nginx-svc.default.svc.cluster.local @10.96.0.10
Pod滚动更新后,依然可以解析:
kubectl delete pod --all
dig -t A nginx-svc.default.svc.cluster.local @10.96.0.10
创建service:(NodePort方式)
vim service-example.yaml
kubectl create -f service-test.yaml
kubectl get services my-nginx
从外部访问 Service 的第二种方式,适用于公有云上的 Kubernetes 服务。这时候,你可以指定一个 LoadBalancer 类型的Service
vim lb-service.yaml
在service提交后,Kubernetes就会调用 CloudProvider 在公有云上为你创建一个负载均衡服务,并且把被代理的 Pod 的 IP地址配置给负载均衡服务做后端。
从外部访问的第三种方式叫做ExternalName
vim ex-service.yaml
kubectl create -f ex-service.yaml
dig -t A my-service.default.svc.cluster.local @10.96.0.10
service允许为其分配一个公有IP
vim ex-service.yaml
kubectl create -f ex-service.yaml
kubectl get services ex-service
ingress-nginx
官网: https://kubernetes.github.io/ingress-nginx/
应用ingress controller定义文件
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/mandatory.yaml
应用ingress-service定义文件
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml
kubectl -n ingress-nginx get pod
kubectl -n ingress-nginx get services
创建ingress服务:
vim ingress.yaml
kubectl apply -f ingress.yaml
kubectl get ingresses.
用DaemonSet结合nodeselector来部署ingress-controller到特定的node上,然后使用HostNetwork直接把该pod与宿主机node的网络打通,直接使用宿主机的80/433端口就能访问服务。
修改ingress controller部署文件
vim mandatory.yaml ##我已经将需要的镜像下载上传到harbor仓库,所以这里使用harbor仓库
kubectl label nodes server6 type=ingress
应用更新配置
kubectl -n ingress-nginx delete deployments.apps nginx-ingress-controller
kubectl apply -f mandatory.yaml
Ingress TLS 配置
openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout tls.key -out tls.crt -subj "/CN=nginxsvc/O=nginxsvc"
kubectl create secret tls tls-secret --key tls.key --cert tls.crt
vim ingress-https.yaml
Ingress 认证配置
yum install -y httpd-tools
htpasswd -c auth huayu
kubectl create secret generic basic-auth --from-file=auth
vim ingress-auth.yaml
kubectl create -f ingress-auth.yaml
Ingress地址重写
vim ingress-rewrite.yaml
kubectl apply -f ingress-rewrite.yaml
annotations参数