‘壹’ 企业级k8s集群部署
二进制包
注:推荐用二进制包部署Kubernetes集群,虽手动部署麻烦,但可以学习很多工作原理利于后期维护。
环境
可以使用VMware虚拟机,宿主机必须8G内存以上
• 服务器可以访问外网,有从网上拉取镜像的需求
单Master服务器规划:( 注:部署时候根据具体环境进行IP地址调整即可 )
这里使用3台组建集群,可容忍1台机器故障,当然,你也可以使用5台组建集群
etcd1: 192.168.3.110 etcd2: 192.168.3.112 etcd3: 192.168.3.113
cfssl是一个开源的证书管理工具,使用json文件生成证书,相比openssl更方便使用。
找任意一台服务器操作,这里用Master节点。
创建工作目录:
自签CA:
生成证书:
会生成ca.pem和ca-key.pem文件。
创建证书申请文件:
注:上述文件hosts字段中IP为所有etcd节点的集群内部通信IP,一个都不能少!为了方便后期扩容可以多写几个预留的IP。
生成证书:
会生成etcd.pem和春陵让etcd-key.pem文件。
https://github.com/etcd-io/etcd/releases/download/v3.5.1/ etcd-v3.5.1-linux-amd64.tar.gz
以下在节点1上操作,然后将文件拷贝到其他集群机器
把刚才生成的证书拷贝到配置文件中的路径:
注意修改节点2和节点3分别etcd.conf配置,按照下面提示的修改
启动各节点的etcd服务
如果输出上面信息,就说明集群部署成功。
如果有问题看日志:/var/log/message
docker二进制下载地址:
https://download.docker.com/linux/static/stable/x86_64/docker-19.03.9.tgz
注:使用yum安装也行
集群所有机器都安装docker
生成证扒局书:
会生成ca.pem和ca-key.pem文件。
创建证书申请文件:
生成证书:
会生成k8s.pem和k8s-key.pem文件。
下载地汪陆址参考:
https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.20.md
https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.20.md#downloads-for-v12013
Wget https://dl.k8s.io/v1.20.13/kubernetes-server-linux-amd64.tar.gz
把刚才生成的证书拷贝到配置文件中的路径:
TLS Bootstrapping 机制,对work-node加入进行自签证书用
创建上述配置文件中token文件:
token 可以自行生产,网络下怎么生产
kube-apiserver服务
生成kube-controller-manager证书:
生成kubeconfig文件(以下是shell命令,直接在终端执行):
生成kube-scheler证书:
生成kubeconfig文件:
生成kubeconfig文件:
通过kubectl工具查看当前集群组件状态:
在所有worker node创建工作目录:
从master节点拷贝:
注:由于网络插件还没有部署,节点会没有准备就绪 NotReady
二进制包下载地址:https://github.com/containernetworking/plugins/releases
确保kubelet启用CNI:
在Master执行:
应用场景:例如kubectl logs
在Master节点将Worker Node涉及文件拷贝到新节点192.168.3.112/113
注:这几个文件是证书申请审批后自动生成的,每个Node不同,必须删除
Node2(192.168.3.113 )节点同上。记得修改主机名!
访问地址:https://NodeIP:30001
创建service account并绑定默认cluster-admin管理员集群角色:
使用输出的token登录Dashboard。
CoreDNS用于集群内部Service名称解析。
DNS解析测试:
这样 单Master集群就搭建完成了
‘贰’ k8s一个pod加载多个containers,指定pod运行的node
问题描述
Kubernetes有着自己特定的调度算法与策略信咐,有Master中的Scheler组件来实现,根据Node资源使用情况自动调度Pod的创建,通常可以满足我们大部分的需求。但是有时我们希望可以将某些Pod调度到特定硬件节点上,这里采用目前最为简单的nodeName和nodeSelector来实现Pod调度。
假设以下场景:有三个Node,分别为滑梁纯107、108、109,创建Deployments来部署Tomcat应用,指定在107节点上创建Pod。
解决方案
nodeName
Pod.spec.nodeName将Pod直接调度到指定的Node节点上,会跳过Scheler的调度策略,该匹配规则是强制匹配。
Tomcatl.yaml文件
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: myweb
spec:
replicas: 2
template:
metadata:
labels:
app: myweb
spec:
nodeSelector: 107 #直接通过节点名称调度到指定节点
containers:
- name: myweb
image: harbor/tomcat:8.5-jre8
ports:
- containerPort: 80
nodeSelector
Pod.spec.nodeSelector通过kubernetes的label-selector机制选择节点,由调度器调度策略匹配label,而后渣卖调度Pod到目标节点,该匹配规则属于强制约束。
设置 Node Lable
kubectl label nodes 107 type=backEndNode1
1
Tomcatl.yaml文件
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: myweb
spec:
replicas: 2
template:
metadata:
labels:
app: myweb
spec:
nodeSelector:
type: backEndNode1
containers:
- name: myweb
image: harbor/tomcat:8.5-jre8
ports:
- containerPort: 80
创建Deployment
kubectl create -f Tomcat.yaml
‘叁’ k8s安装部署
K8s集群搭建毁灶
1 centos版本信息查看
[root@localhost ~]# uname -a
Linux localhost.localdomain 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
k8s集群机器关闭防火墙
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
2 安装必要的源余竖包
k8s集群安装以雹大下安装包
[root@k8s-node ~]# yum -y install net-tools wget vim ntpd
[root@k8s-node ~]# systemctl enable ntpd
[root@k8s-node ~]# systemctl start ntpd
3配置hosts
[root@k8s-node ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.248.141 k8s-master
192.168.248.142 k8s-node
4 部署master节点
4.1 Master节点安装必要的安装包
[root@k8s-master ~]# yum -y install etcd
4.2更改/etc/etcd/etcd.conf配置文件
[root@k8s-master etcd]# cat /etc/etcd/etcd.conf | grep -v "^#"
ETCD_DATA_DIR="/var/lib/etcd/default.etcd"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379,http://0.0.0.0:4001"
ETCD_NAME="master"
ETCD_ADVERTISE_CLIENT_URLS= http://k8s-master:2379,http://k8s-master:4001
4.3设置开机启动并验证状态
[root@k8s-master ~]#systemctl enable etcd
[root@k8s-master ~]#systemctl start etcd
etcd检查
[root@k8s_master ~]# etcdctl -C http://k8s-master:4001 cluster-health
member 8e9e05c52164694d is healthy: got healthy result from http://k8s_master:2379 cluster is healthy
[root@k8s_master ~]# etcdctl -C http://k8s-master:2379 cluster-health
member 8e9e05c52164694d is healthy: got healthy result from http://k8s_master:2379 cluster is healthy
5 安装部署docker环境(略)
6 安装kubernetes
[root@k8s_master ~]# yum install kubernetes
安装过程中报错如下
Error: docker-ce conflicts with 2:docker-1.13.1-75.git8633870.el7.centos.x86_64
可以执行如下命令解决
1、查看安装过的docker:yum list installed | grep docker
2、卸载docker:yum remove -y docker-ce.x86_64 0:18.03.0.ce-1.el7.centos
3、删除容器镜像:rm -rf /var/lib/docker
再次安装kubernetes,安装成功,而且会自动安装docker
6.1修改apiserver服务的配置文件
[root@k8s-master kubernetes]# cat /etc/kubernetes/apiserver | grep -v "^#"
KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"
KUBE_API_PORT="--port=8080"
KUBE_ETCD_SERVERS="--etcd-servers=http://192.168.248.141:2379"
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ResourceQuota"
KUBE_API_ARGS=""
6.2修改config配置文件:
[root@k8s-master kubernetes]# cat /etc/kubernetes/config | grep -v "^#"
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://192.168.248.141:8080"
设置开机启动,开启服务
[root@k8s-master ~]#systemctl enable kube-apiserver kube-controller-manager kube-scheler docker
[root@k8s-master ~]#systemctl start kube-apiserver kube-controller-manager kube-scheler docker
6.3查看服务端口:
[root@k8s-master ~]# netstat –tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1273/master
tcp 0 0 127.0.0.1:2380 0.0.0.0:* LISTEN 2126/etcd
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 571/rpcbind
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1362/dnsmasq
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 998/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 996/cupsd
tcp6 0 0 ::1:25 :::* LISTEN 1273/master
tcp6 0 0 :::4001 :::* LISTEN 2126/etcd
tcp6 0 0 :::6443 :::* LISTEN 3216/kube-apiserver
tcp6 0 0 :::10251 :::* LISTEN 3222/kube-scheler
tcp6 0 0 :::2379 :::* LISTEN 2126/etcd
tcp6 0 0 :::10252 :::* LISTEN 3221/kube-controlle
tcp6 0 0 :::111 :::* LISTEN 571/rpcbind
tcp6 0 0 :::8080 :::* LISTEN 3216/kube-apiserver
tcp6 0 0 :::22 :::* LISTEN 998/sshd
tcp6 0 0 ::1:631 :::* LISTEN 996/cupsd
7部署node节点
7.1安装docker(略)安装k8s(略)
7.2 Node节点主机做以下配置:
修改config配置文件
[root@k8s-node kubernetes]# cat /etc/kubernetes/config | grep -v "^#"
KUBE_LOGTOSTDERR="--logtostderr=true"
KUBE_LOG_LEVEL="--v=0"
KUBE_ALLOW_PRIV="--allow-privileged=false"
KUBE_MASTER="--master=http://192.168.248.141:8080"
修改kubelet配置文件
[root@k8s-node kubernetes]# cat /etc/kubernetes/kubelet | grep -v "^#"
KUBELET_ADDRESS="--address=0.0.0.0"
KUBELET_HOSTNAME="--hostname-override=192.168.248.142"
KUBELET_API_SERVER="--api-servers=http://192.168.248.141:8080"
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"
KUBELET_ARGS=""
设置开机启动、开启服务
[root@k8s_client1 ~]# systemctl enable kubelet kube-proxy
[root@k8s_client1 ~]# systemctl start kubelet kube-proxy
查看端口:
[root@k8s_client1 ~]# netstat –ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1277/master
tcp 0 0 127.0.0.1:10248 0.0.0.0:* LISTEN 3246/kubelet
tcp 0 0 127.0.0.1:10249 0.0.0.0:* LISTEN 3133/kube-proxy
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 575/rpcbind
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1332/dnsmasq
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1000/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 998/cupsd
tcp6 0 0 ::1:25 :::* LISTEN 1277/master
tcp6 0 0 :::4194 :::* LISTEN 3246/kubelet
tcp6 0 0 :::10250 :::* LISTEN 3246/kubelet
tcp6 0 0 :::10255 :::* LISTEN 3246/kubelet
tcp6 0 0 :::111 :::* LISTEN 575/rpcbind
tcp6 0 0 :::22 :::* LISTEN 1000/sshd
tcp6 0 0 ::1:631 :::* LISTEN 998/cupsd
Master上查看集群中的节点及节点状态
[root@k8s-master kubernetes]# kubectl get node
NAME STATUS AGE
192.168.248.142 Ready 2m
[root@k8s-master kubernetes]# kubectl -s http://k8s-master:8080 get node
NAME STATUS AGE
192.168.248.142 Ready 2m
kubernetes集群搭建完成。
在k8s集群中创建pod,如果出现如下错误
其中最主要的问题是:details: (open /etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt: no such file or directory)
解决方案:
查看/etc/docker/certs.d/registry.access.redhat.com/redhat-ca.crt (该链接就是上图中的说明) 是一个软链接,但是链接过去后并没有真实的/etc/rhsm,所以需要使用yum安装:
yum install *rhsm*
安装完成后,执行一下docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest
如果依然报错,可参考下面的方案:
wget http://mirror.centos.org/centos/7/os/x86_64/Packages/python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm
rpm2cpio python-rhsm-certificates-1.19.10-1.el7_4.x86_64.rpm | cpio -iv --to-stdout ./etc/rhsm/ca/redhat-uep.pem | tee /etc/rhsm/ca/redhat-uep.pem
注释:rpm2cpio命令用于将rpm软件包转换为cpio格式的文件
cpio命令主要是用来建立或者还原备份档的工具程序,cpio命令可以复制文件到归档包中,或者从归档包中复文件。
-i 还原备份档
-v 详细显示指令的执行过程
这两个命令会生成/etc/rhsm/ca/redhat-uep.pem文件.
[root@k8s-node ~]# docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest
在master节点新建pod并查看起状态为正常
flannel是CoreOS提供用于解决Dokcer集群跨主机通讯的覆盖网络工具。它的主要思路是:预先留出一个网段,每个主机使用其中一部分,然后每个容器被分配不同的ip;让所有的容器认为大家在同一个直连的网络,底层通过UDP/VxLAN等进行报文的封装和转发。
‘肆’ k8s添加/删除节点
一,准备新设备,新建一台虚机,尽量和其他阶段保持一致(ubantu20要知道固定ip)
二,按照搭建手册准备节点的前置条件
ubantu20.10 搭建部署k8s v1.20.0集群步骤
sudo apt install -y nfs-common cifs-utils
三,添加新节点到集群
1,生成token
kubeadm token list #token如果没有就巧迅是过期了 要重新生成
kubeadm token create
2,获取ca
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/卜搜dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'
3,孝弊此添加集群,需要加入的节点上执行
kubeadm join 192.168.0.153:6443 --token ajbh7x.sqm1fgfkqt9etn5l --discovery-token-ca-cert-hash sha256:
删除节点
1,卸载节点(drain 翻译排出,此时卸载节点,但是没有删除)
kubectl drain <node name> --delete-local-data --force --ignore-daemonsets
2,删除节点
kubectl delete node <node name>
3,清空init配置,需要删除的节点上执行
kubeadm reset
‘伍’ K8s系统部署kubelet服务
kubelet 是在每个 Node 节点上运行的主要 “节点代理”。它可以使用以下之一向 apiserver 注册: 主机名(hostname);覆盖主机名的参数;某云驱动的特定逻辑。
kubelet 是基于 PodSpec 来工作的。每个 PodSpec 是一个描述 Pod 的 YAML 或 JSON 对象。 kubelet 接受通过各种机制(主要是通过 apiserver)提供的一组 PodSpec,并确保这些 PodSpec 中描述的容器处于运行状态且运行状况良好。 kubelet 不管理不是由 Kubernetes 创建的容器。
在hdss01-221.host.com和hdss01-222.host.com:主机上操作:
签发kubelet证书:
在运维主机hdss01-200.host.com上:
创建生成证书签名请求(csr)的json配置文件:
hosts:要把使用和可能使用的ip地址都写上。( 一定要先规划好 )
~]# cd /opt/certs/
certs]# vi kubelet-csr.json
{
"CN": "k8s-kubelet",
"hosts": [
"127.0.0.1",
"10.41.1.210",
"10.41.1.221",
"10.41.1.222",
"10.41.1.223",
"10.41.1.224",
"10.41.1.225",
"10.41.1.226",
"10.41.1.227",
"10.41.1.228"
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "henan",
"L": "zhengzhou",
"O": "jx",
"OU": "xxzx"
}
]
}
certs]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server kubelet-csr.json |cfssl-json -bare kubelet
把证书复制到运算节点hdss01-221.host.com和hdss01-222.host.com上:
cd /opt/kubernetes/server/bin/cert
scp hdss01-200:/opt/certs/kubelet.pem .
scp hdss01-200:/opt/certs/kubelet-key.pem
创建配置kubelet.kubeconfig:
只做一次,最后生成的 kubelet.kubeconfig 拷贝至其他节点
conf]# cd /opt/kubernetes/server/bin/conf
set-cluster:
kubectl config set-cluster myk8s
--certificate-authority=/opt/kubernetes/server/bin/cert/ca.pem
--embed-certs=true
--server=https://10.41.1.210:7443
--kubeconfig=kubelet.kubeconfig
set-credentials:
kubectl config set-credentials k8s-node
--client-certificate=/opt/kubernetes/server/bin/cert/client.pem
--client-key=/opt/kubernetes/server/bin/cert/client-key.pem
--embed-certs=true
--kubeconfig=kubelet.kubeconfig
set-context:
kubectl config set-context myk8s-context
--cluster=myk8s
--user=k8s-node
--kubeconfig=kubelet.kubeconfig
use-context:
kubectl config use-context myk8s-context --kubeconfig=kubelet.kubeconfig
创建资源配置文件(给用户k8s-node授予权限):
conf]# cat /opt/kubernetes/server/bin/conf/k8s-node.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: k8s-node
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:node
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: User
name: k8s-node
conf]# kubectl create -f k8s-node.yaml
conf]# kubectl get clusterrolebinding k8s-node -o yaml
在hdss01-222.host.com上:
cert]# cd /opt/kubernetes/server/bin/conf
conf]# scp hdss01-221:/opt/kubernetes/server/bin/conf/kubelet.kubeconfig .
准备pause基础镜像:
在运维主机hdss01-200.host.com上操作:
下载镜像:
certs]# docker pull kubernetes/pause
给镜像打tag
certs]# docker tag f9d5de079539 harbor.od.com/public/pause:latest
上传到私有库:
certs]# docker push harbor.od.com/public/pause:latest
创建kubelet启动脚本:
hdss01-221.host.com上:
cat /opt/kubernetes/server/bin/kubelet.sh
#!/bin/sh
./kubelet
--anonymous-auth=false
--cgroup-driver systemd
--cluster-dns 192.168.0.2
--cluster-domain cluster.local
--runtime-cgroups=/systemd/system.slice
--kubelet-cgroups=/systemd/system.slice
--fail-swap-on="false"
--client-ca-file ./cert/ca.pem
--tls-cert-file ./cert/kubelet.pem
--tls-private-key-file ./cert/kubelet-key.pem
--hostname-override hdss01-221.host.com #hdss01-222做相应的更改 hdss01-222.host.com
--image-gc-high-threshold 20
--image-gc-low-threshold 10
--kubeconfig ./conf/kubelet.kubeconfig
--log-dir /data/logs/kubernetes/kube-kubelet
--pod-infra-container-image harbor.od.com/public/pause:latest
--root-dir /data/kubelet
bin]# chmod +x kubelet.sh
bin]# mkdir -p /data/logs/kubernetes/kube-kubelet /data/kubelet
创建supervisor配置:
hdss01-221.host.com上:
bin]# cat /etc/supervisord.d/kube-kubelet.ini
[program:kube-kubelet-01-221] #hdss01-222.host.com上修改改为22
command=/opt/kubernetes/server/bin/kubelet.sh ; the program (relative uses PATH, can take args)
numprocs=1 ; number of processes copies to start (def 1)
directory=/opt/kubernetes/server/bin ; directory to cwd to before exec (def no cwd)
autostart=true ; start at supervisord start (default: true)
autorestart=true ; retstart at unexpected quit (default: true)
startsecs=30 ; number of secs prog must stay running (def. 1)
startretries=3 ; max # of serial start failures (default 3)
exitcodes=0,2 ; 'expected' exit codes for process (default 0,2)
stopsignal=QUIT ; signal used to kill process (default TERM)
stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10)
user=root ; setuid to this UNIX account to run the program
redirect_stderr=true ; redirect proc stderr to stdout (default false)
stdout_logfile=/data/logs/kubernetes/kube-kubelet/kubelet.stdout.log ; stderr log path, NONE for none; default AUTO
stdout_logfile_maxbytes=64MB ; max # logfile bytes b4 rotation (default 50MB)
stdout_logfile_backups=4 ; # of stdout logfile backups (default 10)
stdout_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0)
stdout_events_enabled=false ; emit events on stdout writes (default false)
bin]# supervisorctl update
bin]# supervisorctl status
bin]# kubectl get nodes
ROlES添加标签,设定节点角色,可同时加两个标签
bin]#kubectl label node hdss01-221.host.com node-role.kubernetes.io/master=
bin]# kubectl label node hdss01-221.host.com node-role.kubernetes.io/node=
bin]#kubectl label node hdss01-222.host.com node-role.kubernetes.io/node=
bin]# kubectl label node hdss01-222.host.com node-role.kubernetes.io/master=
‘陆’ k8s:将pod部署到指定的node运行(pod&node选择部署策略)
查看所有节点labels:
添加labels:
修改yaml配置文件:
添加nodeSelector配置,样式为[label.key]: [label.value]
修改后重启服务
参考文章: https://blog.csdn.net/lzy__yuan/article/details/106913428
nodeSelector配置相对简单,k8s提供了另外一个pod调度配置: nodeAffinity(节点亲和) ,相对于nodeSelector的简单匹配他拥有更多更加个歼枯性化的配置。
这段配氏唤洞置表示:该pod可以被调度到标签key为 "deploy.type" ,值为 "yztssjdxt-test" 或 "yztssjdxt" 的节点。
通过使用的语句不同,调度分成软策略(soft)和硬策略(hard) ,在软策略下,如果没有满足调度条件的节点,pod会忽略这条规则,继续完成调度。而硬策略下,pod必须部署到满足条件的节点上,如果没有满足条件的节点,就不停重试。
DuringScheling和IgnoredDuringExecution组合生成目前主要的nodeaffinity策略
软硬策略可以组合使用 ,如下面这段配链仿置中pod必须被调度到标签为 "deploy.type=yztssjdxt-test" 的节点。另外,在满足该条件的节点中,优先使用具有 "server=oms" 标签的节点。
nodeAffinity中nodeSelector字段下,节点满足任何一个条件即可;但更下一级matchExpressions,节点必须同时满足所有条件才能运行pod 。
如下面这段配置需要deploy.type=yztssjdxt-test、server=oms同时满足
而这段配置只需要deploy.type=yztssjdxt-test、deploy.type1=yztssjdxt满足一个即可
operator字段 :pod与node的匹配逻辑,可选的操作符有:(我只测过in、notin)
如下方这段配置,pod将不会调度到deploy.type=yztssjdxt-test的node上
‘柒’ k8s deploy 部署在哪个node
k8s将pod部署到指定的咐租消node运行(pod&node选择部署策略)。
_odeSelector配置相对简单,k8s提型运供了另外一个pod调度配置:nodeAffinity(节点亲衡知和),相对于nodeSelector的简单匹配他拥有更多更加个性化的配置。
‘捌’ k8s系列02-kubeadm部署flannel网络的k8s集群
本文主要在centos7系统上基于 docker 和 flannel 组件部署 v1.23.6 版本的k8s原生集群,由于集群主要用于自己平时学习和测试使用,加上资源有限,暂不涉及高可扰轮用部署。
此前写的一些关于k8s基础知识和集群搭建的一些 方案 ,有需要的同学可以看一下。
机器均为8C8G的虚拟机,硬盘为100G。
同一个k8s集群内的所有节点需要确保 mac 地址和 proct_uuid 均唯一,开始集群初始化之前需要检查相关信息
如果k8s集群的节点有多个网卡,确保每个节点能通过正确的网卡互联访问
这里可以根据自己的习惯选择ntp或者是chrony同步均可,同步的时间源服务器可以选择阿里云的 ntp1.aliyun.com 或者是国家时间中心的 ntp.ntsc.ac.cn 。
k8s集群之间通信和服务暴露需要使用较多端口,为了方便,直接禁用防火墙
这里主要是需要配置内核加载 br_netfilter 和 iptables 放行 ipv6 和 ipv4 的流量,确保集群内的容器能够正常通信。
虽然新版本的k8s已经支持双栈网络,但是本次的集群部署过程并不涉及IPv6网络的通信,因此关闭IPv6网络支持
IPVS是专门设计用来应对负载均衡场景的组件, kube-proxy 中的 IPVS 实现 通过减少对 iptables 的使用来增加可扩展性。在 iptables 输入链中不使用 PREROUTING,而是创建一个假的接口,叫做 kube-ipvs0,雀樱当k8s集群中的负载均衡配置变多的时候,IPVS能实现比iptables更高效的转发性能。
详细的官方文档可以参考 这里 ,由于在刚发布的1.24版本中移除了 docker-shim ,因此安装的 版本≥1.24 的时候需要注意 容器运行时 的选择。这里我们安装的版本低于1.24,因此我们继续使用docker。
docker的具体安装可以参考我之前写的 这篇文章 ,这里不做赘述。
CentOS7使用的是 systemd 来初始化系统并管理进程,初始化进程会生成并使用一个 root 控制组 ( cgroup ), 并充当 cgroup 管理器。 Systemd 与 cgroup 集成紧密,并将为每个 systemd 单元分配一个 cgroup 。 我们也可以配置 容缓岁信器运行时 和 kubelet 使用 cgroupfs 。 连同 systemd 一起使用 cgroupfs 意味着将有两个不同的 cgroup 管理器 。而当一个系统中同时存在cgroupfs和systemd两者时,容易变得不稳定,因此最好更改设置,令容器运行时和 kubelet 使用 systemd 作为 cgroup 驱动,以此使系统更为稳定。 对于 Docker, 需要设置 native.cgroupdriver=systemd 参数。
k8s官方有 详细的文档 介绍了如何设置kubelet的 cgroup driver ,需要特别注意的是,在1.22版本开始,如果没有手动设置kubelet的cgroup driver,那么默认会设置为systemd
一个比较简单的指定kubelet的 cgroup driver 的方法就是在 kubeadm-config.yaml 加入 cgroupDriver 字段
我们可以直接查看configmaps来查看初始化之后集群的kubeadm-config配置。
当然因为我们需要安装的版本高于1.22.0并且使用的就是systemd,因此可以不用再重复配置。
kube三件套就是 kubeadm 、 kubelet 和 kubectl ,三者的具体功能和作用如下:
需要注意的是:
CentOS7的安装比较简单,我们直接使用官方提供的 yum 源即可。需要注意的是这里需要设置 selinux 的状态,但是前面我们已经关闭了selinux,因此这里略过这步。
在集群中所有节点都执行完上面的三点操作之后,我们就可以开始创建k8s集群了。因为我们这次不涉及高可用部署,因此初始化的时候直接在我们的目标master节点上面操作即可。
此时我们再查看对应的配置文件中的镜像版本,就会发现已经变成了对应阿里云镜像源的版本
当我们看到下面这个输出结果的时候,我们的集群就算是初始化成功了。
刚初始化成功之后,我们还没办法马上查看k8s集群信息,需要配置kubeconfig相关参数才能正常使用kubectl连接apiserver读取集群信息。
配置完成后,我们再执行相关命令就可以查看集群的信息了。
这时候我们还需要继续添加剩下的两个节点作为worker节点运行负载,直接在剩下的节点上面运行集群初始化成功时输出的命令就可以成功加入集群:
如果不小心没保存初始化成功的输出信息也没有关系,我们可以使用kubectl工具查看或者生成token
添加完成之后我们再查看集群的节点可以发现这时候已经多了两个node,但是此时节点的状态还是 NotReady ,接下来就需要部署CNI了。
flannel 应该是众多开源的CNI插件中入门门槛最低的CNI之一了,部署简单,原理易懂,且相关的文档在网络上也非常丰富。
针对 kube-flannel.yml 文件,我们需要修改一些 参数 以适配我们的集群:
修改完成之后我们直接部署即可
集群部署完成之后我们在k8s集群中部署一个nginx测试一下是否能够正常工作。首先我们创建一个名为 nginx-quic 的命名空间( namespace ),然后在这个命名空间内创建一个名为 nginx-quic-deployment 的 deployment 用来部署pod,最后再创建一个 service 用来暴露服务,这里我们先使用 nodeport 的方式暴露端口方便测试。
部署完成后我们直接查看状态
最后我们进行测试,这个nginx-quic的镜像默认情况下会返回在nginx容器中获得的用户请求的IP和端口