您当前的位置: 首页 > 慢生活 > 程序人生 网站首页程序人生
14、Kubernetes - 集群安装 - 配置私有仓库、集群功能演示(cni 插件)
发布时间:2022-12-10 22:02:01编辑:雪饮阅读()
Step1
安装harbor
Harbor的安装没有提到过,不过我觉得和之前那个node1和node2安装差不多,可以参考
12、Kubernetes - 集群安装 (gaojiupan.cn)
只是主机名应该是可以不用设置的。
这里需要注意的是
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
这个未必能连接到
则可以试试这个
有点小失误,当我进行到
yum install -y yum-utils device-mapper-persistent-data lvm2
这一步骤时才发现忘记了重启载入新的内核。。。
不过就从这里重启吧,希望影响不大哈。
Step2
配置docker
mkdir -p /etc/docker
配置为
[root@localhost ~]# cat /etc/docker/daemon.json
{
"exec-opts":["native.cgroupdriver=systemd"],
"log-driver":"json-file",
"log-opts": {
"max-size":"100m"
},
"insecure-registries":["https://hub.atguigu.com"]
}
由于我们这里不太好搞证书,毕竟类似docker-hub这种是要提供给大家用的,所以这种模拟docker-hub的,肯定要证书,那么我们可以使用insecure-registries设置某个hub为可信hub(表明该hub证书是安全的),然后后面我们搞自签证书好像是吧。
该步骤不仅harbor节点要配置,master节点和node1以及node2节点都要配置,因为后面规划是k8s集群直接从这个harbor节点上的这个模拟docker-hub的上面进行相关容器等组件的docker镜像源。
并且都重启docker
systemctl restart docker
快捷操作:
cat <<EOF > /etc/docker/daemon.json
{
"exec-opts":["native.cgroupdriver=systemd"],
"log-driver":"json-file",
"log-opts": {
"max-size":"100m"
},
"insecure-registries":["https://hub.atguigu.com"]
}
EOF
Step3
安装docker-compose
然后在docker的github的releases(Releases · docker/compose (github.com))里下载
docker-compose-linux-x86_64
然后扔到harbor里面
mv docker-compose-linux-x86_64 /usr/local/bin/docker-compose
并给予所有用户的执行权限于该文件
chmod a+x /usr/local/bin/docker-compose
这里a+x,a是所有用户,x是执行权限
然后我们看看版本哈
[root@localhost ~]# docker-compose --version
Docker Compose version v2.14.0
Step4
安装harbor
解压展开harbor-offline-installer-v1.2.0.tgz到路径
/usr/local/harbor后如:
[root@localhost ~]# ll /usr/local/harbor
总用量 485012
drwxr-xr-x 3 root root 23 12月 7 22:12 common
-rw-r--r-- 1 root root 1163 9月 11 2017 docker-compose.clair.yml
-rw-r--r-- 1 root root 1988 9月 11 2017 docker-compose.notary.yml
-rw-r--r-- 1 root root 3191 9月 11 2017 docker-compose.yml
-rw-r--r-- 1 root root 4304 9月 11 2017 harbor_1_1_0_template
-rw-r--r-- 1 root root 4345 9月 11 2017 harbor.cfg
-rw-r--r-- 1 root root 496209164 9月 11 2017 harbor.v1.2.0.tar.gz
-rwxr-xr-x 1 root root 5332 9月 11 2017 install.sh
-rw-r--r-- 1 root root 371640 9月 11 2017 LICENSE
-rw-r--r-- 1 root root 482 9月 11 2017 NOTICE
-rwxr-xr-x 1 root root 17592 9月 11 2017 prepare
-rwxr-xr-x 1 root root 4550 9月 11 2017 upgrade
然后编辑/usr/local/harbor.cfg将hostname修改为你要自定义的一个域名
比如我这里就修改为hub.atguigu.com
ui_url_protocol修改为https,因为要用证书
需要注意的是db_password为默认密码,这里我就不修改了,这里默认是root123
然后下面这几个
ssl_cert = /data/cert/server.crt
ssl_cert_key = /data/cert/server.key
#The path of secretkey storage
secretkey_path = /data
是与证书有关,注意下路径,等下制作“假”证书要用到。
Step5
制作证书
按照步骤4的路径建立一个证书存放路径
mkdir -p /data/cert
生成私钥,输入两遍证书密码
[root@localhost harbor]# openssl genrsa -des3 -out server.key 2048
Generating RSA private key, 2048 bit long modulus
..............................+++
.................................................+++
e is 65537 (0x10001)
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:
生成证书请求
[root@localhost harbor]# openssl req -new -key server.key -out server.csr
Enter pass phrase for server.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:guangDong
Locality Name (eg, city) [Default City]:shenZhen
Organization Name (eg, company) [Default Company Ltd]:xiaoZuZhi
Organizational Unit Name (eg, section) []:peiXunJiGou
Common Name (eg, your name or your server's hostname) []:hub.atguigu.com
Email Address []:1509272975@qq.com
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
分别要输入刚才的私钥密码、国家代码、省、市、组织、机构、完全限定域名(要做证书的域名,这里就是我们刚才自定义的那个hub.atguigu.com)、管理员邮箱、最后两项就无所谓了。
然后将刚才制作证书第一步中生成的私钥备份下,用这个备份去退掉刚才生成的私钥的密码,生成一个新的不带密码的私钥。
因为一般的给nginx这类使用证书时候带密码的是不行的。
[root@localhost harbor]# cp server.key server.key.org
[root@localhost harbor]# openssl rsa -in server.key.org -out server.key
Enter pass phrase for server.key.org:
writing RSA key
然后请求证书签名
[root@localhost harbor]# openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
Signature ok
subject=/C=CN/ST=guangDong/L=shenZhen/O=xiaoZuZhi/OU=peiXunJiGou/CN=hub.atguigu.com/emailAddress=1509272975@qq.com
Getting Private key
然后将生成的这四个文件都移动到/data/cert/也就是刚才我们从harbor.cfg中看到的证书目录中
mv server.csr server.key.org server.crt server.key /data/cert/
实际上一开始就应该在/data/cert目录中做证书就好了。。。刚给忘了。。。
然后给证书目录的文件以所有用户授予执行权限
[root@localhost cert]# chmod a+x *
Step6
正式安装harbor
制作了证书后,启动docker
systemctl start docker
然后回到刚才harbor离线包展开的目录/usr/local/harbor中
然后执行该离线包中所带的install.sh安装脚本开始安装
[root@localhost harbor]# ./install.sh
Step7
配置harbor解析记录
就是需要给master、node1、node2的hosts上增加解析到这个harbor的一条记录
echo "192.168.66.100 hub.atguigu.com" >> /etc/hosts
这三个节点都要添加的
当然harbor自己也是要添加的
由于这里我们想要用物理机也能访问harbor,所以咱们的windows上面也是要配置的,
我这里是win11,其实路径都差不多的。
在harbor上,那个install.sh安装完成后运行docker ps –a一般的像是如下这样7个的状态都是up,那么也就没有什么问题了。
[root@localhost harbor]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8c952f5d7521 vmware/nginx-photon:1.11.13 "nginx -g 'daemon of…" 8 minutes ago Up 8 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp nginx
fc56e3fe30f3 vmware/harbor-jobservice:v1.2.0 "/harbor/harbor_jobs…" 8 minutes ago Up 8 minutes harbor-jobservice
944d35c8c9f1 vmware/harbor-ui:v1.2.0 "/harbor/harbor_ui" 8 minutes ago Up 8 minutes harbor-ui
98d37761b6cf vmware/harbor-db:v1.2.0 "docker-entrypoint.s…" 8 minutes ago Up 8 minutes 3306/tcp harbor-db
c749db05bfbc vmware/harbor-adminserver:v1.2.0 "/harbor/harbor_admi…" 8 minutes ago Up 8 minutes harbor-adminserver
09b8e8658731 vmware/registry:2.6.2-photon "/entrypoint.sh serv…" 8 minutes ago Up 8 minutes 5000/tcp registry
0652b51c9d9a vmware/harbor-log:v1.2.0 "/bin/sh -c 'crond &…" 8 minutes ago Up 8 minutes 127.0.0.1:1514->514/tcp
最重要的据说是
harbor-adminserver
harbor-db
harbor-log
Step8
测试harbor的web端
经过上面的解析,一般的现在应该是可以访问harbor(hub.atguigu.com)了
出现这种不安全的情况也没有问题,毕竟咱们是自签证书。继续访问即可。
然后会进入乳此之境
根据刚才harbor节点中/usr/local/harbor/harbor.cfg中配置
harbor_admin_password = Harbor12345
则可知道默认用户名是admin,对应密码是Harbor12345
果然成功登录
Step9
启动harbor及基于linux命令行登录harbor
昨个测试了win10节点访问harbor,那么今天也来试试咱们k8s集群中的节点,这里以node01节点来试试
[root@k8s-node01 ~]# docker login https://hub.atguigu.com
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
当然,这里我也并非一次性成功的,出现过下面这种情况
[root@k8s-node01 ~]# docker login https://hub.atguigu.com
Username: admin
Password:
Error response from daemon: Get "http://hub.atguigu.com/v2/": dial tcp 192.168.66.100:80: connect: connection refused
这种原因是因为harbor没有启动,因为我昨天关机了。
在harbor节点上,进入harbor所在目录,然后docker-compose up –d就搞定了
[root@hub ~]# cd /usr/local/harbor
[root@hub harbor]# ls
common docker-compose.notary.yml harbor_1_1_0_template harbor.v1.2.0.tar.gz LICENSE prepare
docker-compose.clair.yml docker-compose.yml harbor.cfg install.sh NOTICE upgrade
[root@hub harbor]# docker-compose up -d
[+] Running 7/7
⠿ Container harbor-log Running 0.0s
⠿ Container harbor-db Running 0.0s
⠿ Container harbor-adminserver Running 0.0s
⠿ Container registry Started 0.5s
⠿ Container harbor-ui Running 0.0s
⠿ Container harbor-jobservice Started 0.9s
⠿ Container nginx Started 0.0s
Step10
接下来我们拉取一个别家的镜像,试试推送到我们搭建的这个harbor上面去
首先我们要知道我们怎么推送到这上面
在harbor的推送镜像的那个地方展开
按照这个提示进行推送即可。
则如:
docker pull wangyanglinux/myapp:v1
docker tag wangyanglinux/myapp:v1 hub.atguigu.com/library/myapp:v1
docker push hub.atguigu.com/library/myapp:v1
由于我们后面还要在k8s上进行批量操作,所以这里先将这两个镜像删除掉(发现tag后就本地多了一个镜像,也或许是tag并push后)
docker rmi -f wangyanglinux/myapp:v1
docker rmi -f hub.atguigu.com/library/myapp:v1
Step11
部署nginx及pod问题解决
在master节点上执行命令如
kubectl run nginx-deployment --image=hub.atguigu.com/library/myapp:v1 --port=80 --replicas=1
这里--port=80可以忽略,因为是扁平化网络,80在k8s集群内部是互通的。
这里还指定了nginx的副本为1
然后--image指定了从我们的harbor上刚才我们推送进去的myapp:v1镜像中作为部署nginx的来源
我们也可以看看这里(也请记住,这里下载数是0)
其实之前docker push之后这里libray中就刷新下浏览器就能看到的。
我们可以看到我们部署的这个nginx已经有了,且是up状态的
[root@k8s-master01 ~]# kubectl get deployment
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-deployment 0/1 1 0 6m31s
deployment会连接rs,所以这里同时我们可以看到rs的
[root@k8s-master01 ~]# kubectl get rs
NAME DESIRED CURRENT READY AGE
nginx-deployment-85756b779 1 1 0 7m24s
遇到一个新的问题,当我用kubectl get pod查看时候发现ready为0/1。应该出现为1/1才对
然后我用kubectl delete pod [pod的name]
删除pod后再次获取仍旧如此:
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-85756b779-tksvs 0/1 ContainerCreating 0 35m
查看pod详情
kubectl describe pod nginx-deployment-85756b779-tksvs
发现有这样一个错误
Warning FailedCreatePodSandBox 39m kubelet, k8s-node02 Failed create pod sandbox: rpc error: code = Unknown desc = [failed to set up sandbox container "ceb2d08024a8128fec3891738d2744db009401437404d844204d6a2ba7c68c17" network for pod "nginx-deployment-85756b779-tksvs": NetworkPlugin cni failed to set up pod "nginx-deployment-85756b779-tksvs_default" network: failed to find plugin "flannel" in path [/opt/cni/bin], failed to clean up sandbox container "ceb2d08024a8128fec3891738d2744db009401437404d844204d6a2ba7c68c17" network for pod "nginx-deployment-85756b779-tksvs": NetworkPlugin cni failed to teardown pod "nginx-deployment-85756b779-tksvs_default" network: failed to find plugin "flannel" in path [/opt/cni/bin]]
Normal SandboxChanged 4m21s (x164 over 39m) kubelet, k8s-node02 Pod sandbox changed, it will be killed and re-created.
关键在于
network: failed to find plugin "flannel" in path [/opt/cni/bin]
而这错误里面又提到的是k8s-node02节点上面的,所以需要在node02节点上的/opt/cni/bin目录中把flannel加上
需要下载CNI插件:CNI plugins v0.8.6
github下载地址:https://github.com/containernetworking/plugins/releases/tag/v0.8.6
(在1.0.0版本后CNI Plugins中没有flannel)
tar zxvf cni-plugins-linux-amd64-v0.8.6.tgz
复制 flannel 到 /opt/cni/bin/
cp flannel /opt/cni/bin/
然后在master上稍等片刻,再次kubectl get pod
就会发现已经恢复了
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-85756b779-tksvs 1/1 Running 0 39m
并且状态是running了
Step12
查看pod的详情情况,可以发现是运行在了node2节点上了,不在master节点,就有点负载均衡内味了。
在节点2上面可以看到其是以docker容器的形式运行在节点2上面的
[root@k8s-node02 ~]# docker ps | grep nginx
00fc22d6d491 hub.atguigu.com/library/myapp "nginx -g 'daemon of…" 13 minutes ago Up 13 minutes k8s_nginx-deployment_nginx-deployment-85756b779-tksvs_default_fb84b682-ad04-4686-b706-ad95771a67d2_0
56cab18bbc1b k8s.gcr.io/pause:3.1 "/pause" 13 minutes ago Up 13 minutes k8s_POD_nginx-deployment-85756b779-tksvs_default_fb84b682-ad04-4686-b706-ad95771a67d2_1
在master节点上通过kubectl get pod -o wide命令可以看到其在节点2上,同时可以看到一个ip地址
[root@k8s-master01 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-85756b779-tksvs 1/1 Running 0 46m 10.224.2.2 k8s-node02 <none> <none>
那么由于k8s的网络是扁平化的,所以在master节点上也可以访问这个节点2上面的这个nginx服务
[root@k8s-master01 ~]# curl 10.244.2.2
curl: (7) Failed connect to 10.244.2.2:80; 拒绝连接
贼。。。。又打脸
再打脸,眼睛呢?
应该是224才对。。。
[root@k8s-master01 ~]# curl 10.224.2.2
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
可以看到里面貌似有个叫做hostname.html的文件,我们访问试试看
[root@k8s-master01 ~]# curl 10.224.2.2/hostname.html
nginx-deployment-85756b779-tksvs
我们再次刷新Step11步骤中的那个harbor所处界面位置
可以看到下载数变成2了,也可能是我中间试错多下载了一次,其实正常情况下应该是变成1了。
删除pod然后pod由于我们部署时候有设置副本节点数为1,当时你删除了,就违反了这个规则,所以会再次自动生成一个pod,可能是生成过程中又积累了下载数(可能是要重新从harbor上面下载的)。
Step13
使用k8s的好处
假如那天心情不好,不小心删除了这个nginx
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-85756b779-tksvs 1/1 Running 0 77m
删除了这个nginx
[root@k8s-master01 ~]# kubectl delete pod nginx-deployment-85756b779-tksvs
pod "nginx-deployment-85756b779-tksvs" deleted
(⊙﹏⊙),又打脸了吧
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-85756b779-hgr9q 0/1 ContainerCreating 0 25s
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-85756b779-hgr9q 0/1 ContainerCreating 0 29s
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-85756b779-hgr9q 0/1 ContainerCreating 0 30s
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-85756b779-hgr9q 0/1 ContainerCreating 0 31s
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-85756b779-hgr9q 0/1 ContainerCreating 0 32s
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-85756b779-hgr9q 0/1 ContainerCreating 0 32s
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-85756b779-hgr9q 0/1 ContainerCreating 0 33s
[root@k8s-master01 ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-85756b779-hgr9q 0/1 ContainerCreating 0 35s
[root@k8s-master01 ~]# kubectl describe pod nginx-deployment-85756b779-hgr9q
Name: nginx-deployment-85756b779-hgr9q
Namespace: default
Priority: 0
Node: k8s-node01/192.168.66.20
Start Time: Thu, 08 Dec 2022 22:57:17 +0800
Labels: pod-template-hash=85756b779
run=nginx-deployment
Annotations: <none>
Status: Pending
IP:
Controlled By: ReplicaSet/nginx-deployment-85756b779
Containers:
nginx-deployment:
Container ID:
Image: hub.atguigu.com/library/myapp:v1
Image ID:
Port: 80/TCP
Host Port: 0/TCP
State: Waiting
Reason: ContainerCreating
Ready: False
Restart Count: 0
Environment: <none>
Mounts:
/var/run/secrets/kubernetes.io/serviceaccount from default-token-xt842 (ro)
Conditions:
Type Status
Initialized True
Ready False
ContainersReady False
PodScheduled True
Volumes:
default-token-xt842:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-xt842
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 56s default-scheduler Successfully assigned default/nginx-deployment-85756b779-hgr9q to k8s-node01
Warning FailedCreatePodSandBox 55s kubelet, k8s-node01 Failed create pod sandbox: rpc error: code = Unknown desc = [failed to set up sandbox container "b2e274169e9712ceb1cfc42ff2810c2cb6717a0bb6b4bca318c10ea804b5c5af" network for pod "nginx-deployment-85756b779-hgr9q": NetworkPlugin cni failed to set up pod "nginx-deployment-85756b779-hgr9q_default" network: failed to find plugin "flannel" in path [/opt/cni/bin], failed to clean up sandbox container "b2e274169e9712ceb1cfc42ff2810c2cb6717a0bb6b4bca318c10ea804b5c5af" network for pod "nginx-deployment-85756b779-hgr9q": NetworkPlugin cni failed to teardown pod "nginx-deployment-85756b779-hgr9q_default" network: failed to find plugin "flannel" in path [/opt/cni/bin]]
Normal SandboxChanged 2s (x5 over 54s) kubelet, k8s-node01 Pod sandbox changed, it will be killed and re-created.
同上面node02节点刚才遇到的一样的问题,也是将flannel搞进去
只是这次正好被分配到了节点1上面去了。
啊。。。。。炸了
又手贱,放到了master也一份。。。
不过这个或许影响不大,暂时先这样。
当解决了node1的flannel问题后,master这边又看到了nginx死灰复燃。。
[root@k8s-master01 test]# kubectl get pod
NAME READY STATUS RESTARTS AGE
nginx-deployment-85756b779-hgr9q 1/1 Running 0 6m10s
这就是所谓的使用k8s的好处。。。
Step14
我觉得就一个nginx不够用的,于是乎我要扩容的,我在master节点上进行扩容
kubectl scale --replicas=3 deployment/nginx-deployment
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-85756b779-f45wk 1/1 Running 0 16s 10.224.2.4 k8s-node02 <none> <none>
nginx-deployment-85756b779-hgr9q 1/1 Running 1 46h 10.224.1.7 k8s-node01 <none> <none>
nginx-deployment-85756b779-tpfth 1/1 Running 0 16s 10.224.2.3 k8s-node02 <none> <none>
可以看到3个nginx在跑,两个运行在节点2上,一个运行在节点1上
那么我随便删除一个nginx看看,由于节点2上比较多,我就删除一个节点2上面的
[root@k8s-master01 ~]# kubectl delete pod nginx-deployment-85756b779-tpfth
pod "nginx-deployment-85756b779-tpfth" deleted
[root@k8s-master01 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-85756b779-dljnk 1/1 Running 0 16s 10.224.1.8 k8s-node01 <none> <none>
nginx-deployment-85756b779-f45wk 1/1 Running 0 3m14s 10.224.2.4 k8s-node02 <none> <none>
nginx-deployment-85756b779-hgr9q 1/1 Running 1 46h 10.224.1.7 k8s-node01 <none> <none>
可以看到删除后他还会再次出来,只是id不同了,由于我们的期望副本数为3,所以他会自动调整的,保证期望数是3的。
一般的传统流程是用upstream来配置的。
Step15
暴露下刚才这3台nginx集群的端口(暴露的是30000端口给访问者,内部是80端口)
kubectl expose deployment nginx-deployment --port=30000 --target-port=80
你发现无意间一个集群都搞出来了。。。
查看当前所有集群列表
[root@k8s-master01 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6d3h
nginx-deployment ClusterIP 10.97.227.239 <none> 30000/TCP 24s
然后根据集群ip去访问这个集群
[root@k8s-master01 ~]# curl 10.97.227.239:30000
Hello MyApp | Version: v1 | <a href="hostname.html">Pod Name</a>
可以看到又看到了这个hostname.html
不断访问这个hostname.html,可见默认应是轮询调度
[root@k8s-master01 ~]# curl 10.97.227.239:30000/hostname.html
nginx-deployment-85756b779-dljnk
[root@k8s-master01 ~]# curl 10.97.227.239:30000/hostname.html
nginx-deployment-85756b779-hgr9q
[root@k8s-master01 ~]# curl 10.97.227.239:30000/hostname.html
nginx-deployment-85756b779-f45wk
[root@k8s-master01 ~]# curl 10.97.227.239:30000/hostname.html
nginx-deployment-85756b779-dljnk
[root@k8s-master01 ~]# curl 10.97.227.239:30000/hostname.html
nginx-deployment-85756b779-hgr9q
[root@k8s-master01 ~]# curl 10.97.227.239:30000/hostname.html
nginx-deployment-85756b779-f45wk
这几个id都在上面那个pod列表所包含的所有id中。
可以看看该集群的调度算法
[root@k8s-master01 ~]# ipvsadm -Ln | grep 10.97.227.239
TCP 10.97.227.239:30000 rr
可见默认是rr调度算法。
也可以看到全部不用过滤
[root@k8s-master01 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.96.0.1:443 rr
-> 192.168.66.10:6443 Masq 1 1 0
TCP 10.96.0.10:53 rr
TCP 10.96.0.10:9153 rr
TCP 10.97.227.239:30000 rr
-> 10.224.1.7:80 Masq 1 0 0
-> 10.224.1.8:80 Masq 1 0 0
-> 10.224.2.4:80 Masq 1 0 0
UDP 10.96.0.10:53 rr
可以看到这里论调是10.244.1.7, 10.244.1.8, 10.244.2.4,正好对应部署这3个nginx的pod
[root@k8s-master01 ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-deployment-85756b779-dljnk 1/1 Running 0 14m 10.224.1.8 k8s-node01 <none> <none>
nginx-deployment-85756b779-f45wk 1/1 Running 0 17m 10.224.2.4 k8s-node02 <none> <none>
nginx-deployment-85756b779-hgr9q 1/1 Running 1 46h 10.224.1.7 k8s-node01 <none> <none>
Step16
但是这个集群ip是你物理机无法访问的。
那么也是有办法解决的,我们默认情况下集群svc中TYPE字段为ClusterIP
[root@k8s-master01 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6d3h
nginx-deployment ClusterIP 10.97.227.239 <none> 30000/TCP 24s
那么执行如kubectl edit svc nginx-deployment命令去在弹出的vi编辑区域中将type修改为NodePort
[root@k8s-master01 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6d4h
nginx-deployment NodePort 10.97.227.239 <none> 30000:32046/TCP 17m
然后可以看到给我了一个乱七八糟的端口32046
当然,也可以看看这个端口详情哈
[root@k8s-master01 ~]# netstat -anpt | grep :32046
tcp6 0 0 :::32046 :::* LISTEN 3223/kube-proxy
然后可以发现所有物理机可以访问“各个”节点
并且各个节点都暴露了这个端口。
但是实际上我发现我的node1节点是66.20竟然不行,再次确认下node1节点的ip地址,发现竟然变成了66.204,然后换成66.204才能访问。。。。
明明是static的为什么还会变,就比较离谱了。
嗨,先不管了。反正那个老师也没有访问66.20
Step17
实际上刚才我又去仔细看了,老师是有访问的。。。
打脸了。。。
那么这个问题怎么解决呢?
首先我是直接systemctl restart network,虽然ifconfig看到ens33是66.20了,但是上面的k8s集群暴露的那个端口从物理机还是访问不了。那么我重启node1节点的虚拟机发现也还是不行,过不了一会儿又变成了非66.20的一个ip地址了。。。
那么换个思路。。。。
原因是network与NetworkManager服务冲突
第一步是禁用NetworkManager服务
systemctl stop NetworkManager.service
systemctl disable NetworkManager.service
第二步重启network服务
systemctl restart network
这波操作当然是要在出现了ip地址变动的节点上执行的。
关键字词:Kubernetes,集群,安装,配置,私有,仓库,功能,演示