1.说明
实际上IPV6和IPV4在在配置上没有太大差异,本次只在配置上做相关说明。由于公司的云环境还不支持IPV6,本次主要在虚拟机上完成。
- 主机规划
名称 | IPV4 | IPV6 |
---|---|---|
master | 192.168.6.110 | fd00::20c:29ff:fe9f:52be |
node2 | 192.168.6.103 | fd00::39df:8f1b:e228:d42 |
node3 | 192.168.6.113 | fd00::20c:29ff:fead:d381 |
- 网络规划
名称 | 协议 |
---|---|
service-cluster-ip-range | fd03::/120 |
service-node-port-range | 30000-32767 |
cluster-cidr | fd05::/120 |
cluster-dns | fd05::2 |
node-cidr-mask-size | 121 |
2.环境准备
高版本的VMware开启IPV6支持,同时设置IPV6的网络地址范围。
3.组件配置
1.对虚拟机的配置(三台操作)
#增加配置 [root@master ~]# vim /etc/sysctl.conf net.ipv6.conf.all.disable_ipv6 = 0 net.ipv6.conf.default.disable_ipv6 = 0 net.ipv6.conf.lo.disable_ipv6 = 0 net.ipv6.conf.all.forwarding=1 #使之生效 [root@master ~]# sysctl -p [root@master ~]# vim /etc/sysconfig/network #添加 NETWORKING_IPV6=yes [root@master ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0 #添加 IPV6INIT=yes IPV6_AUTOCONF=yes [root@master ~]# reboot
证书源文件中的配置。此处不会过多介绍安装。关键介绍下配置部分,安装可参考Kubernetes安装.
- apiserver-csr.json
{ "CN": "kube-apiserver", "hosts": [ "10.254.0.1", "192.168.6.110", "192.168.6.112", "192.168.6.130", "192.168.6.113", // 主机 "fd00::20c:29ff:fe9f:52be", "fd00::39df:8f1b:e228:d42", "fd00::20c:29ff:fead:d381", "127.0.0.1", "::1", "fd03::1", "fd05::1", "localhost", "kubernetes", "kubernetes.default", "kubernetes.default.svc", "kubernetes.default.svc.cluster", "kubernetes.default.svc.cluster.local" ], "key": { "algo": "rsa", "size": 2048 }, "names": [{ "C": "CN", "ST": "NanJing", "L": "NanJing", "O": "Kubernetes", "OU": "Kubernetes-manual" }] }
- etcd-csr.json 此处为了省事,我把IPV4和IPV6全部加上了。
{ "CN": "etcd", "hosts": [ "192.168.6.110", "192.168.6.112", "192.168.6.130", "192.168.6.113", "fd00::20c:29ff:fe9f:52be", "fd00::39df:8f1b:e228:d42", "fd00::20c:29ff:fead:d381", "127.0.0.1", "::1" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "ST": "NanJing", "L": "NanJing", "O": "Kubernetes", "OU": "Kubernetes-manual" } ] }
3.Etcd的配置 实际上把IPV4换成IPV6即可,注意写法。
[Unit] Description=Etcd Server After=network.target After=network-online.target Wants=network-online.target [Service] Type=notify #User=etcd ExecStart=/data/cloud/etcd/etcd \ --name=node1 \ --heartbeat-interval=500 \ --election-timeout=5000 \ --cert-file=/data/cloud/pki/etcd.pem \ --key-file=/data/cloud/pki/etcd-key.pem \ --trusted-ca-file=/data/cloud/pki/ca.pem \ --peer-cert-file=/data/cloud/pki/etcd.pem \ --peer-key-file=/data/cloud/pki/etcd-key.pem \ --peer-trusted-ca-file=/data/cloud/pki/ca.pem \ --initial-advertise-peer-urls=https://[fd00::20c:29ff:fe9f:52be]:2380 \ --listen-peer-urls=https://[fd00::20c:29ff:fe9f:52be]:2380 \ --listen-client-urls=https://[fd00::20c:29ff:fe9f:52be]:2379,http://[::1]:2379 \ --advertise-client-urls=https://[fd00::20c:29ff:fe9f:52be]:2379 \ --initial-cluster-token=kubernetes \ --initial-cluster=node1=https://[fd00::20c:29ff:fe9f:52be]:2380,node2=https://[fd00::39df:8f1b:e228:d42]:2380,node3=https://[fd00::20c:29ff:fead:d381]:2380 \ --initial-cluster-state=new \ --data-dir=/data/cloud/work/etcd Restart=on-failure RestartSec=10 LimitNOFILE=65536 [Install] WantedBy=multi-user.target
5.apiserver的关键配置
--bind-address=:: \ 相当于IPV4中的0.0.0.0 --secure-port=6443 \ --insecure-port=0 \ 禁用非安全端口 --advertise-address=fd00::20c:29ff:fe9f:52be \ --service-cluster-ip-range=fd03::/120 \ 设置serviceip的范围 --service-node-port-range=30000-32767 \ --etcd-servers=https://[fd00::20c:29ff:fe9f:52be]:2379,https://[fd00::20c:29ff:fe83:39c3]:2379,https://[fd00::20c:29ff:fead:d381]:2379 \ //其他部分略......
6.controller-manager的关键配置
ExecStart=/data/cloud/kubernetes/bin/kube-controller-manager \ --bind-address=:: \ --allocate-node-cidrs=true \ --cluster-cidr=fd05::/120 \ --node-cidr-mask-size=121 \ 此处除以一点要比上面的120大
6.scheduler的关键配置
ExecStart=/data/cloud/kubernetes/bin/kube-scheduler \ --bind-address=:: \ --leader-elect=true \ --logtostderr=false \ --kubeconfig=/data/cloud/pki/scheduler.conf \ --log-dir=/data/cloud/work/kubernetes/kube-scheduler \ --v=2
7.kubelet 的关键配置
ExecStart=/data/cloud/kubernetes/bin/kubelet \ --fail-swap-on=false \ --address=:: \ --healthz-bind-address=:: \ --hostname-override=node2 \ --node-ip=fd00::39df:8f1b:e228:d42 \ //此处一定要加上,不然默认注册的是IPV4 --pod-infra-container-image=k8s.gcr.io/pause:3.1 \ --network-plugin=cni --cni-bin-dir=/opt/cni/bin \ --kubeconfig=/data/cloud/pki/kubelet.conf \ --bootstrap-kubeconfig=/data/cloud/pki/bootstrap.conf \ --pod-manifest-path=/data/cloud/kubernetes/manifests \ --allow-privileged=true \ --cluster-dns=fd05::2 \ //设置DNS的地址
8.kubelet 的关键配置
ExecStart=/data/cloud/kubernetes/bin/kube-proxy \ --bind-address=:: \ --hostname-override=node2 \ --cluster-cidr=fd05::/120 \ --kubeconfig=/data/cloud/pki/proxy.conf \ --logtostderr=true \ --log-dir=/data/cloudwork/kubernetes/kube-proxy \ --v=2
9.docker的配置 /etc/docker/daemon.json
{ "insecure-registry":["0.0.0.0/0"], "ipv6": true, "fixed-cidr-v6": "2001:db8:1::/64", "data-root": "/data/cloud/work/docker", //我一般会调整其默认的工作目录 "host":["unix:///var/run/docker.sock","tcp://:::2375"], "log-level":"debug" }
4.启动组件进行验证
- 集群整体状况
为了方便操作做了个别名
alias kubectl=’kubectl –kubeconfig=/data/cloud/pki/admin.conf’
[root@node1 system]# kubectl get cs NAME STATUS MESSAGE ERROR controller-manager Healthy ok scheduler Healthy ok etcd-0 Healthy {"health":"true"} etcd-2 Healthy {"health":"true"} etcd-1 Healthy {"health":"true"}
- 节点状况,此处可以看到INTERNAL-IP注册上来的是IPV6地址
[root@node1 system]# kubectl get no -owide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME node2 Ready 36m v1.13.0 fd00::39df:8f1b:e228:d42 CentOS Linux 7 (Core) 3.10.0-957.el7.x86_64 docker://18.9.3 node3 Ready 51m v1.13.0 fd00::20c:29ff:fead:d381 CentOS Linux 7 (Core) 3.10.0-957.5.1.el7.x86_64 docker://18.9.2
- kubernetes 分配的service ip
[root@node1 system]# kubectl get all NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE service/kubernetes ClusterIP fd03::1 443/TCP 3h34m
- calico的配置
//指定证书位置 kubeconfig_filepath: "/data/cloud/pki/admin.conf"
- calico部署
[root@node1 calico]# kubectl apply -f calico.yaml [root@node1 yaml]# kubectl get pod -n kube-system -owide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES calico-node-mwkj5 1/1 Running 0 87m fd00::39df:8f1b:e228:d42 node2 calico-node-vjhpb 1/1 Running 0 102m fd00::20c:29ff:fead:d381 node3
- 测试
[root@node1 yaml]# kubectl run tomcat --image=tomcat:8.0 --replicas=2 --port=8080 [root@node1 yaml]# kubectl get pod -owide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES tomcat-79d98465c6-jqvgp 1/1 Running 0 17s fd05::b node3 tomcat-79d98465c6-n4rgh 1/1 Running 0 17s fd05::86 node2 //node2直接访问容器 [root@node2 images]# curl -6g [fd05::86]:8080 Apache Tomcat/8.5.38 ······ //node3直接访问容器 [root@node3 cloud]# curl -6g [fd05::b]:8080 Apache Tomcat/8.5.38 ······ //暴露端口 [root@node1 calico]# kubectl expose deployment tomcat --port=8080 --target-port=8080 --type=NodePort service/myip exposed [root@node1 yaml]# kubectl get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP fd03::1 443/TCP 6h38m tomcat NodePort fd03::46 8080:31900/TCP 21m
- 通过serviceIP+端口访问(8080),因为master未安装kube-proxy,在node2和node3上访问,为了省事此处截图。
- 通过node+端口访问(31900)