安装kubernetes
添加kubernetes源
在master节点上添加k8s软件源,并分发到其他两台机器上。在/etc/yum.repos.d/目录下新增kubernetes.repo。内容如下:
[kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
把kubernetes.repo文件分发到其他两台机器上,执行如下命令:
ansible k8s -m copy -a "src=/etc/yum.repos.d/kubernetes.repo dest=/etc/yum.repos.d/kubernetes.repo"
安装
在master节点下执行如下命令安装相应的软件:
yum install -y kubelet-1.24.3 kubeadm-1.24.3 kubectl-1.24.3
生成默认配置并修改相应的参数,通过如下命名生成一个默认的配置文件:
kubeadm config print init-defaults > kubeadm-init.yaml
根据自己的环境修改对应的参数:
# api版本是kubeadm.k8s.io/v1beta3 apiVersion: kubeadm.k8s.io/v1beta3 # 引导令牌 bootstrapTokens: - groups: - system:bootstrappers:kubeadm:default-node-token token: abcdef.0123456789abcdef # 令牌 ttl: 24h0m0s # 过期时间为 24 小时 usages: - signing # 用于签名 - authentication # 用于认证 # 初始化配置 kind: InitConfiguration localAPIEndpoint: advertiseAddress: 192.168.122.130 #master节点IP bindPort: 6443 # 绑定端口 nodeRegistration: criSocket: unix:///var/run/containerd/containerd.sock # containerd 的 socket 文件地址 imagePullPolicy: IfNotPresent # 镜像拉取策略为 IfNotPresent name: k8s-master # 节点名称 taints: null # 污点为空 # 集群配置 apiServer: timeoutForControlPlane: 4m0s # 控制平面的超时时间为 4 分钟 apiVersion: kubeadm.k8s.io/v1beta3 certificatesDir: /etc/kubernetes/pki # 证书目录 clusterName: kubernetes # 集群名称 controllerManager: {} # 控制器管理器 dns: {} # dns etcd: local: dataDir: /var/lib/etcd # etcd 数据目录 imageRepository: registry.aliyuncs.com/google_containers #阿里云容器源地址 kind: ClusterConfiguration kubernetesVersion: 1.24.0 # kubernetes 版本 networking: dnsDomain: cluster.local # dns 域名 podSubnet: 10.244.0.0/16 #pod的IP网段 serviceSubnet: 10.96.0.0/12 # 服务子网 scheduler: {} # 调度器
初始化
执行如下命令进行初始化:
kubeadm init --config=kubeadm-init.yaml --v=6
–config:指定根据那个配置文件进行初始
–v:指定日志级别,越高越详细
按照初始化成功提示信息,做如下操作:
mkdir -p $HOME/.kube cp -i /etc/kubernetes/admin.conf $HOME/.kube/config chown $(id -u):$(id -g) $HOME/.kube/config
接下来执行kubectl就可以看到node了
kubectl get node
查看k8s各部件启动情况,执行如下命令:
kubectl get pod --all-namespaces -o wide
node节点配置
node节点安装kubeadm
cat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=http://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64 enabled=1 gpgcheck=0 repo_gpgcheck=0 gpgkey=http://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg http://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF
安装相关组件
yum install -y kubeadm-1.24.3 --disableexcludes=kubernetes
添加join命令
kubeadm join 192.168.248.130:6443 --token abcdef.0123456789abcdef \ --discovery-token-ca-cert-hash sha256:e9e29c804f92193928f37ca157b73a7ad77e7929314db98855b3ba6e2ce2273d
如果我们后续需要添加node节点时,可以到master节点执行下面的命令获取token相关信息
kubeadm token create --print-join-command
如果添加某台节点异常了,修改后可以执行 kubeadm reset的命令,然后在重新join加入
网络配置
coredns还没启动,因为还没有安装网络插件,接下来安装网络插件,可以在该文档中选择我们自己的网络插件,这里安装flannel
wget http://down.i4t.com/k8s1.24/kube-flannel.yml
根据需求修改网卡配置,我这里ens33为主的:
containers: - name: kube-flannel image: quay.io/coreos/flannel:v0.12.0-amd64 command: - /opt/bin/flanneld args: - --ip-masq - --kube-subnet-mgr - --iface=ens33 # 如果是多网卡的话,指定内网网卡的名称
在kubeadm.yaml文件中设置了podSubnet网段,同时在flannel中网段也要设置相同的。 (我这里默认就是相同的配置)
执行部署
kubectl apply -f kube-flannel.yml
CNI插件问题
默认情况下containerd也会有一个cni插件,但是我们已经安装Flannel了,我们需要使用Flannel的cni插件,需要将containerd里面的cni配置文件进行注释,否则2个配置会产生冲突 。因为如果这个目录中有多个 cni 配置文件,kubelet 将会使用按文件名的字典顺序排列的第一个作为配置文件,所以前面默认选择使用的是 containerd-net 这个插件。
mv /etc/cni/net.d/10-containerd-net.conflist /etc/cni/net.d/10-containerd-net.conflist.bak systemctl restart containerd kubelet
验证
验证dns是否正常能解析和pod之间。这里新建一个测试的yaml文件,内容如下:
apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - image: nginx:alpine name: nginx ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: nginx spec: selector: app: nginx type: NodePort ports: - protocol: TCP port: 80 targetPort: 80 nodePort: 30001 --- apiVersion: v1 kind: Pod metadata: name: busybox namespace: default spec: containers: - name: busybox image: abcdocker9/centos:v1 command: - sleep - "3600" imagePullPolicy: IfNotPresent restartPolicy: Always
执行下面命令,创建pod
kubectl apply -f test.yaml
使用nslookup查看是否能返回地址
kubectl exec -it busybox -- nslookup kubernetes
测试nginx svc以及Pod内部网络通信是否正常 ,分别在三台机器上进行下面操作
ping 10.104.115.26 #nginx svc ip ping 10.244.1.2 #podIP
如果成功ping同说明node跟pod的网络已经打通了。否则检查kube-proxy的模式是否正确。
nodes/集群内部 无法访问ClusterIP
默认情况下,我们部署的kube-proxy通过查看日志,能看到如下信息:Flag proxy-mode="" unknown,assuming iptables proxy
原因分析:
并没有正确使用ipvs模式
解决方法:
在master上修改kube-proxy的配置文件,添加mode为ipvs。
kubectl edit cm kube-proxy -n kube-system
kubectl edit cm kube-proxy -n kube-system
删除原来的POD,会自动重启kube-proxy 的pod
kubectl get pod -n kube-system | grep kube-proxy |awk '{system("kubectl delete pod "$1" -n kube-system")}'
扩展
在使用过程中发现kubectl 命令不能补全,使用起来很不方便。为了提高使用kubectl命令工具的便捷性,介绍一下kubectl命令补全工具的安装。
1、安装bash-completion:
yum install -y bash-completion source /usr/share/bash-completion/bash_completion
2、 应用kubectl的completion到系统环境:
source <(kubectl completion bash) echo "source <(kubectl completion bash)" >> ~/.bashrc