k8s 集群(不推荐)

 

参考连接html

https://blog.csdn.net/real_myth/article/details/78719244node

 

服务器IP角色分布python

Test-01  172.16.119.214  kubernetes nodemysql

Test-02  172.16.119.223  kubernetes nodelinux

Test-03  172.16.119.224  kubernetes nodegit

Test-04  172.16.119.225  kubernetes mastergithub

 

 

Master节点必需组件sql

 

组件名称docker

做用数据库

版本号

etcd

非关系型数据库

v1.9.1

kube-apiserver

核心组件,全部组件均与其通讯,提供Http Restful接口

v1.9.1

kube-controller-manager

集群内部管理中心,负责各种资源管理,如RC,Pod,命名空间等

v1.9.1

kube-scheduler

调度组件,负责node的调度

 

 

Node节点必需组件

组件名称

做用

版本号

kubelet

Node节点中核心组件,负责执行Master下发的任务

v1.9.1

kube-proxy

代理,负责kubelet与apiserver网络。至关于负载均衡,将请求转到后端pod中

 

 

准备工做

先设置本机hosts,编译/etc/hosts添加以下内容:

172.16.119.225  test-04

 

修改内核参数

cat <<EOF >  /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward=1
EOF

sysctl --system

 

关闭swap   k8s1.8版本之后,要求关闭swap,不然默认配置下kubelet将没法启动。

swapoff -a

#防止开机自动挂载 swap 分区
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

 

开启ipvs

不是必须,只是建议,pod的负载均衡是用kube-proxy来实现的,实现方式有两种,一种是默认的iptables,一种是ipvs,ipvs比iptable的性能更好而已。
ipvs是啥?为啥要用ipvs?:https://blog.csdn.net/fanren224/article/details/86548398
后面master的高可用和集群服务的负载均衡要用到ipvs,因此加载内核的如下模块

须要开启的模块是
ip_vs
ip_vs_rr
ip_vs_wrr
ip_vs_sh
nf_conntrack_ipv4

检查有没有开启
cut -f1 -d " " /proc/modules | grep -e ip_vs -e nf_conntrack_ipv4

没有的话,使用如下命令加载
modprobe -- ip_vs
modprobe -- ip_vs_rr
modprobe -- ip_vs_wrr
modprobe -- ip_vs_sh
modprobe -- nf_conntrack_ipv4

ipvs还须要ipset,检查下有没有。若是没有,安装

yum install ipset -y

 

关闭防火墙,禁用selinux

vi /etc/selinux/config
disabled

systemctl disable firewalld
systemctl stop firewalld

 

 

 

软件安装

一、Mster节点:

yum install etcd  kubernetes flannel

kubeadm:用于k8s节点管理(好比初始化主节点、集群中加入子节占为、移除节点等)。

kubectl:用于管理k8s的各类资源(好比查看logs、rs、deploy、ds等)。

kubelet:k8s的服务。

 

 

配置/etc/etcd/etcd.conf

ETCD_DATA_DIR="/var/lib/etcd/master.etcd"

ETCD_LISTEN_CLIENT_URLS="http://127.0.0.1:2379,http://172.16.119.225:2379 "

ETCD_NAME="master"

ETCD_ADVERTISE_CLIENT_URLS="http://127.0.0.1:2379,http://172.16.119.225:2379"

 

启动etcd

systemctl restart etcd  && systemctl enable  etcd 

 

 

检查etcd的健康指标

etcdctl -C http://172.16.119.225:2379 cluster-health

 

配置etcd中关于flannel的key  也就是分配给docker的网段

etcdctl mk /atomic.io/network/config '{ "Network": "10.254.0.0/16" }'

 

配置 /etc/sysconfig/flanneld

FLANNEL_ETCD_ENDPOINTS="http://172.16.119.225:2379"

FLANNEL_ETCD_PREFIX="/atomic.io/network"

 

启动flannel

systemctl start flanneld && systemctl enable flanneld

 

配置/etc/kubernetes/apiserver

KUBE_API_ADDRESS="--insecure-bind-address=0.0.0.0"   #此参数为绑定不安全地址,绑定安全地址参数是  --bind-address=172.16.119.225KUBE_ETCD_SERVERS="--etcd-servers=http://172.16.119.225:2379"

KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"

KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"

KUBE_API_ARGS=""

  

 重启服务并设置开机自启动

systemctl restart kube-apiserver  && systemctl enable kube-apiserver
 
systemctl restart kube-controller-manager  &&  systemctl enable kube-controller-manager

systemctl restart kube-scheduler   &&  systemctl enable  kube-scheduler 

 

二、node节点:

一、安装配置flannel

yum install flannel

配置flannel:/etc/sysconfig/flanneld

FLANNEL_ETCD_ENDPOINTS="http://172.16.119.225:2379"  # 172.16.119.225为master地址

FLANNEL_ETCD_PREFIX="/atomic.io/network"

 

启动flannel

systemctl start flanneld && systemctl enable flanneld

 

 

 

二、安装kubernetes

yum install kubernetes

不一样于master节点,slave节点上须要运行kubernetes的以下组件:

kubelet

kubernets-proxy

 

配置/etc/kubernetes/config

KUBE_LOGTOSTDERR="--logtostderr=true"

# journal message level, 0 is debug

KUBE_LOG_LEVEL="--v=0"

# Should this cluster be allowed to run privileged docker containers

KUBE_ALLOW_PRIV="--allow-privileged=false"

# How the controller-manager, scheduler, and proxy find the apiserver

KUBE_MASTER="--master=http://172.16.119.225:8080"
#172.16.119.225为master地址

 

 

配置 /etc/kubernetes/kubelet

# The address for the info server to serve on (set to 0.0.0.0 or "" for all interfaces)
KUBELET_ADDRESS="--address=172.16.119.225"

# The port for the info server to serve on
KUBELET_PORT="--port=10250"

# You may leave this blank to use the actual hostname
KUBELET_HOSTNAME="--hostname-override= 172.16.119.214"  #node的名字,随意取
# 172.16.119.214为node地址

# location of the api-server
KUBELET_API_SERVER="--api-servers=http://172.16.119.225:6442"
#172.16.119.225为master地址

# pod infrastructure container
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"

# Add your own!
KUBELET_ARGS=""  
 

 

启动kube服务

systemctl restart kubelet && systemctl enable  kubelet

systemctl restart kube-proxy && systemctl enable kube-proxy

 

至此,k8s集群的搭建过程就完成一半了

 

验证集群状态

  • 一、查看端点信息:kubectl get endpoints

 

 

  • 二、查看集群信息:kubectl cluster-info

 

 

  • 三、获取集群中的节点状态: kubectl get nodes

 

认证受权设置

参考连接:https://www.cnblogs.com/lemon-le/p/9970783.html

集群搭建好后务必设置认证受权,不然等后面配置Kubernetes Api Server时会由于没有安全配置致使服务器被渗透,参考https://www.jianshu.com/p/e443b3171253

步骤以下:

一、中止原有kubernetes相关服务,包括service,deployments,pods以及运行的全部kubernetes组件

master节点上:

systemctl stop  kube-apiserver
systemctl stop  kube-controller-manager
systemctl stop  kube-schedulerrm -fr /var/lib/kubelet/*

rm -fr /var/lib/kube-proxy/*

node节点上:

systemctl stop kubelet
systemctl stop kube-proxy
rm -fr /var/lib/kubelet/*
rm -fr /var/lib/kube-proxy/*

 二、设置kube-apiserver的ca证书的相关文件和启动参数

openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -subj "/CN=test-04" -days 5000 -out ca.crt
openssl genrsa -out server.key 2048

注意:生成ca.crt时  /CN 值为master主机名

而后准备master_ssl.conf文件,该文件用于x509 v3版本证书,文件中主要设置master主机 hostname  、ip、 k8s 虚拟赋权名称和该虚拟服务的ClusterIP地址

内容以下:

[req]
req_extensions = v3_req
distinguished_name = req_distinguished_name 
[req_distinguished_name]
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation,digitalSignature,keyEncipherment
subjectAltName = @alt_names

[alt_names]
DNS.1 = kubernetes
DNS.2 = kubernetes.default
DNS.3 = kubernetes.default.svc
DNS.4 = kubernetes.default.svc.cluster.local
DNS.5 = test-04      #服务器的hostname
IP.1 = 172.16.119.225   #master ip
IP.2 = 10.254.0.1      #svc的cluster ip  若是cluster网段是 10.254.0.0/16  此处就写10.254.0.1 
 

 而后基于master_ssl.conf文件建立server.csr和server.crt文件,在生成server.csr时,-subject参数中 /CN 值为master主机名

openssl req -new -key server.key -subj "/CN=test-04" -config  master_ssl.conf -out server.csr

openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -days 5000 -extensions v3_req -extfile master_ssl.conf -out server.crt

所有执行完毕会生成6个文件:ca.crt  ca.key  ca.srl  server.crt  server.csr  server.key 将这些文件复制到一个目录下,如 /var/run/kubernetes/   

 /var/run/kubernetes/  默认只有apiserver.crt 、 apiserver.key 、kubelet.crt和kubelet.key四个文件

 

 

而后在kube-apiserver文件 KUBE_API_ARGS中添加三个启动参数 --client-ca-file     --tls-cert-file   和  --tls-private-key-file,分别表明CA根证书文件、服务器端证书文件和服务端私钥文件

 同时能够更改KUBE_API_ADDRESS     KUBE_API_PORT  KUBE_API_ARGS参数关掉非安全端口8080,设置安全端口为6442,默认为6443

 

KUBE_API_ADDRESS="--bind-address=172.16.119.225"
KUBE_API_PORT="--secure-port=0"
# Comma separated list of nodes in the etcd cluster
KUBE_ETCD_SERVERS="--etcd-servers=http://172.16.119.225:2379"

# Address range to use for services
KUBE_SERVICE_ADDRESSES="--service-cluster-ip-range=10.254.0.0/16"

# default admission control policies
KUBE_ADMISSION_CONTROL="--admission-control=NamespaceLifecycle,NamespaceExists,LimitRanger,SecurityContextDeny,ServiceAccount,ResourceQuota"

# Add your own!
KUBE_API_ARGS="--client-ca-file=/var/run/kubernetes/ca.crt   --tls-cert-file=/var/run/kubernetes/server.crt   --tls-private-key-file=/var/run/kubernetes/server.key  --secure-port=6442"

 

最后重启kube-apiserver服务

systemctl restart kube-apiserver

 

 三、设置kube-controller-manager的客户端证书、私钥和启动参数

openssl genrsa -out cs_client.key 2048
openssl req -new -key cs_client.key -subj "/CN=test-04" -out cs_client.csr
openssl x509 -req -in cs_client.csr -CA /var/run/kubernetes/ca.crt -CAkey /var/run/kubernetes/ca.key -CAcreateserial  -out cs_client.crt -days 5000

此步会生成3个文件:cs_client.key   cs_client.crt  cs_client.csr   把生成的证书复制到/var/run/kubernetes/   而后建立/etc/kubernetes/kubeconfig文件,(kube-controller-manager与kube-scheduler共用),配置客户端证书等参数,内容以下:

apiVersion: v1
kind: Config
users:
- name: controllermanager
  user:
     client-certificate: /var/run/kubernetes/cs_client.crt
     client-key: /var/run/kubernetes/cs_client.key
clusters:
- name: local
  cluster:
     certificate-authority: /var/run/kubernetes/ca.crt
contexts:
- context:
   cluster: local
   user: controllermanager
  name: my-context
current-context: my-context

 

而后,设置kube-controller-manager服务启动参数,注意 --master的地址为https安全服务地址

更改/etc/kubernetes/controller-manager   启动参数

KUBE_CONTROLLER_MANAGER_ARGS="--master=https://172.16.119.225:6442  --service_account_private_key_file=/var/run/kubernetes/server.key  --root-ca-file=/var/run/kubernetes/ca.crt --kubeconfig=/etc/kubernetes/kubeconfig"

 

更改/etc/kubernetes/config 里 KUBE_MASTER="--master=http://127.0.0.1:8080"  改为上面设置的安全地址 KUBE_MASTER="--master=https://172.16.119.225:6442" 

 

重启kube-controller-manager服务

systemctl restart kube-controller-manager

 

四、设置kube-scheduler参数

kube-scheduler复用上一步kube-controller-manager建立的客户端证书,只须要修改/etc/kubernetes/scheduler启动参数便可

KUBE_SCHEDULER_ARGS="--master=https://172.16.119.225:6442  --kubeconfig=/etc/kubernetes/kubeconfig"

重启kube-scheduler服务

systemctl restart kube-scheduler

 

五、设置每台node上kubelet的客户端证书、私钥和启动参数

首先复制kube-apiserver的ca.crt和ca.key文件到node上,而后生成kubelet_client.crt证书,生成证书时-CA参数和-CAkey参数使用的是apiserver的ca.crt和ca.key文件;生成kubelet_client.csr是 -subj参数中 /CN 为本机node ip地址

openssl genrsa -out kubelet_client.key 2048
openssl req -new -key kubelet_client.key -subj "/CN=172.16.119.225" -out kubelet_client.csr
openssl x509 -req -in kubelet_client.csr -CA  ca.crt -CAkey  ca.key -CAcreateserial  -out kubelet_client.crt -days 5000

此步会生成3个文件:kubelet_client.key   kubelet_client.csr   kubelet_client.crt   而后把生成的证书复制到/var/run/kubernetes/目录下

接下来建立/etc/kubernetes/kube_client_config文件(kubelet和kube-proxy共用),配置客户端证书等相关参数,内容以下:

apiVersion: v1
kind: Config
users:
- name: kubelet
  user: 
     client-certificate: /var/run/kubernetes/kubelet_client.crt
     client-key: /var/run/kubernetes/kubelet_client.key
clusters:
- name: local
  cluster: 
     certificate-authority: /var/run/kubernetes/ca.crt
contexts:
- context:
   cluster: local
   user: kubelet
  name: my-context
current-context: my-context

 

而后设置kubelet启动参数

# location of the api-server
KUBELET_API_SERVER="--api-servers=https://172.16.119.225:6442"

# pod infrastructure container
KUBELET_POD_INFRA_CONTAINER="--pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest"

# Add your own!
KUBELET_ARGS="--kubeconfig=/etc/kubernetes/kube_client_config"

重启kubelet服务

systemctl restart kubelet

 

六、设置kube-proxy启动参数

kube-proxy复用上一步建立的客户端证书,只需配置启动参数便可

vim /etc/kubernetes/proxy

KUBE_PROXY_ARGS="--master=https://172.16.119.225:6442  --kubeconfig=/etc/kubernetes/kube_client_config"

重启kube-proxy服务

systemctl restart kube-proxy

 

七、设置kubectl客户端使用安全方式访问apiserver

在使用kubectl对kubenetes集群进行操做时,默认使用非安全端口8080对apiserver进行访问,也能够设置设置为安全访问apiserver的模式,此模式须要设置3个证书相关的参数  --certificat-authority   --client-certificate  和 --client-key

分别表示用于CA受权证书、客户端证书和客户端秘钥,其中

--certificat-authority   使用为kube-apiserver生成的ca.crt文件

--client-certificate      使用为kube-controller-manager生成的cs_client.crt文件

--client-key                使用为kube-controller-manager生成的cs_client.key文件

同时指定apiserver的URL地址为HTTPS安全地址,最后输入须要执行的子命令,便可对apiserver进行安全访问了:

 

kubectl --server=https://172.16.119.225:6442 --certificate-authority=/var/run/kubernetes/ca.crt --client-certificate=/var/run/kubernetes/cs_client.crt  --client-key=/var/run/kubernetes/cs_client.key get nodes

 

但每次这样忒麻烦了,因此写个alias,不知道还有没有其余方法

 编辑 ~/.bashrc  

vim ~/.bashrc 增长下面一局而后source ~/.bashrc  便可

 

alias kubectl='kubectl --server=https://172.16.119.225:6442 --certificate-authority=/var/run/kubernetes/ca.crt --client-certificate=/var/run/kubernetes/cs_client.crt  --client-key=/var/run/kubernetes/cs_client.key'

 

 

 DNS服务搭建

https://blog.51cto.com/ylw6006/2067923 

Kubernetes集群机制经过DNS进行服务名和ip的映射,若是没有配置dns,能够经过kubectl get svc 命令查询集群ip,

但Cluster-ip是变化的,若是经过一个create命令一次批量创建一堆具备相互依赖关系的Pod或者RC,就须要配置DNS

DNS 有两种配置方式,在 1.3 以前使用 etcd + kube2sky + skydns 的方式,在 1.3 以后可使用 kubedns + dnsmasq 的方式。

推荐使用kubedns + dnsmasq 的方式,本次也是使用此方式。

先建立目录,skydns文件都放在/etc/kubernetes/skydns 下

mkdir /etc/kubernetes/skydns

 

一、配置etcd中关于skyDNS的key

 etcdctl mk /skydns/config '{"dns-addr":"10.254.254.254:53","ttl":3600,"domain":"cluster.local."}'

 

二、skynds服务由一个RC和一个Service定义组成,分别由配置文件skydns-rc.yaml和 skydns-svc.yaml定义:

skydns-rc.yaml包含2个容器的定义,须要修改以下几个参数:

--kube_master_url  为master所在的物理主机IP和端口

--domain=cluster.local  设置kubernetes集群中Service所属的域名,本例为cluster.local

apiVersion: v1
kind: ReplicationController
metadata:
  name: kube-dns
  namespace: kube-system
  labels:
    k8s-app: kube-dns
    version: v12
    kubernetes.io/cluster-service: "true"
spec:
  replicas: 1
  selector:
    k8s-app: kube-dns
    version: v12
  template:
    metadata:
      labels:
        k8s-app: kube-dns
        version: v12
        kubernetes.io/cluster-service: "true"
    spec:
      containers:
      - name: kube2sky
        image: docker.io/port/kubernetes-kube2sky
        resources:
          limits:
            cpu: 100m
            memory: 50Mi
          requests:
            cpu: 100m
            memory: 50Mi
        args:
        - --kube_master_url=https://172.16.119.225:6442
        - -domain=cluster.local
        - -etcd-server=http://172.16.119.225:2379 
      - name: skydns
        image: docker.io/skynetservices/skydns
        resources:
          limits:
            cpu: 100m
            memory: 50Mi
          requests:
            cpu: 100m
            memory: 50Mi
        args:
        - -machines=http://172.16.119.225:2379
        - -addr=0.0.0.0:53
        - -ns-rotate=false
        - -domain=cluster.local.  # 点 不能少
        ports:
        - containerPort: 53
          name: dns
          protocol: UDP
        - containerPort: 53
          name: dns-tcp
          protocol: TCP
      dnsPolicy: Default

 

 

skydns-svc.yaml

apiVersion: v1
kind: Service
metadata:
  name: kube-dns
  namespace: kube-system
  labels:
    k8s-app: kube-dns
    kubernetes.io/cluster-service: "true"
    kubernetes.io/name: "KubeDNS"
spec:
  selector:
    k8s-app: kube-dns
  clusterIP:  10.254.254.254
  ports:
  - name: dns
    port: 53
    protocol: UDP
  - name: dns-tcp
    port: 53
    protocol: TCP

注意,skydns须要指定一个固定的IP,以后每一个node节点启动都将使用这个IP,且这个IP必定要是kube-apiserver启动参数--service-cluster-ip-range范围内的IP。

 

建立skydns以前须要修改每一个node上kubelet的启动参数。

三、修改node启动参数

编译kubelet文件,添加俩个启动参数

--cluster-dns  上面配置的10.254.254.254
--cluster-domain 上面配置的cluster.local
KUBELET_ARGS="--kubeconfig=/etc/kubernetes/kube_client_config  --cluster-dns=10.254.254.254 --cluster-domain=cluster.local"

而后重启kubelet服务

systemctl restart kubelet

 

四、建立skydns的RC和SVC

kubectl create -f skydns/skydns-rc.yaml 
kubectl create -f skydns/skydns-svc.yaml 

 查看RC pod svc,确保容器启动成功,若是没有启动成功,查看缘由是否是镜像地址更改了,若是镜像地址改了,能够登陆http://docker.gaoxiaobang.com查看新的镜像地址

若是pod没法启动,可参考文尾解决办法

 

至此,在Kubernetes集群内的虚拟DNS服务已搭建完毕。

 

五、测试效果

部署一个test-dns的Pod进行验证

apiVersion: v1
kind: Pod
metadata:
  name: test-dns
  namespace: default
spec:
  containers:
  - name: test-dns
    image: busybox
    command:
      - sleep
      - "3600"

启动test-dns

 

容器启动成功后,经过下面命令进行测试

kubectl exec -it test-dns  sh

 

 

也能够新建一个pod,而后用 kubectl exec <container_id> nslookup  验证

若是某个Service属于不一样的命名空间,则进行Service查找时,须要带上namespace的名字,如:

kubectl exec test-dns  -- nslookup  default.kubernetes

 

 

 安装Dashboard 

一、下载代码

git clone https://github.com/Qihoo360/wayne/
其中  目录下面就是咱们须要部署的 Wayne 的资源清单文件hack/kubernetes

二、咱们这里将全部服务都部署到 kube-system 命名空间下面,因此将这里的资源清单中的 namespace 都统一改为 kube-system

     

grep -rl default wayne/hack/kubernetes/wayne/ | xargs sed -i 's/default/kube-system/'

三、因为咱们这里是使用上面集群中部署的 MySQL 服务,因此这里须要对 configmap.yaml 文件进行简单的配置,而 360 文档上面的 ConfigMap 是不完整的,须要使用源码里面的 app.conf 文件来进行建立,因此咱们这里可使用 --from-file 关键字来建立 ConfigMap 对象,首先配置下 wayne/src/backend/conf/app.conf 文件,根据我的须要修改,也能够不改,使用默认的配置,而后建立ConfigMap 

   

kubectl create configmap infra-wayne --namespace kube-system --from-file=wayne/src/backend/conf/app.conf

四、而后部署另外俩个应用

kubectl create -f wayne/hack/kubernetes/wayne/deployment.yaml 
kubectl create -f wayne/hack/kubernetes/wayne/service.yaml 

五、建立完成后,能够查看下 Pod 的状态,若是没有错误信息,就证实部署成功了

kubectl get pods -n kube-system

若是失败可用  

kubectl logs -n kube-system  -f infra-wayne-312744915-xdb8b  查看错误信息

或者

 kubectl describe -n kube-system pods infra-wayne-312744915-xdb8b 

 

六、查看端口

kubectl get svc -n kube-system -l app=infra-wayne

 

而后使用本机IP:30771来访问 Wayne 

 

 

 

---------------------------------------------

异常解决

 

一、kubectl create -f  mysql.yaml  后pod没法启动,用kubectl get pod 发现该pod处于ContainerCreating状态

使用kubectl  describe pod mysql-wayne-3939478235-x83pm  查看具体信息时发现报错以下:

 

 解决办法:

各个node节点上都须要安装

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

docker pull registry.access.redhat.com/rhel7/pod-infrastructure:latest

而后删除pod 从新建立

kubectl delete -f mysql.yaml

kubectl create -f mysql.yaml

 

 

二、pod没法删除排查

https://www.58jb.com/html/155.html

 

三、etcd简单操做

 ls 查看

get 获取key的值

rm 删除key

更多的参考 etcdctl help

相关文章
相关标签/搜索