17.K8S学习笔记

k8s的简介以及搭建
一:简介
1.什么是k8s?
k8s是一个docker容器管理工具
它是一个全新的基于容器技术的分布式架构领先方案,是开源的容器集群管理系统。
在docker的基础上,为容器化的应用提供部署运行,资源调度,服务发现和动态伸缩等一系列完整功能

2.—-k8s的优势:
a,容器编排
b,轻量级
c,开源
d,弹性伸缩
e,负载均衡

二:k8s的核心功能
1.自愈: 重新启动失败的容器,在节点不可用时,替换和重新调度节点上的容器,对用户定义的健康检查不响应的容器会被中止,并且在容器准备好服务之前不会把其向客户端广播。
弹性伸缩: 通过监控容器的cpu的负载值,如果这个平均高于80%,增加容器的数量,如果这个平均低于10%,减少容器的数量
服务的自动发现和负载均衡: 不需要修改您的应用程序来使用不熟悉的服务发现机制,Kubernetes 为容器提供了自己的 IP 地址和一组容器的单个 DNS 名称,并可以在它们之间进行负载均衡。
滚动升级和一键回滚: Kubernetes 逐渐部署对应用程序或其配置的更改,同时监视应用程序运行状况,以确保它不会同时终止所有实例。 如果出现问题,Kubernetes会为您恢复更改,利用日益增长的部署解决方案的生态系统。

2.核心概念
(1)master
k8s集群的管理节点,负责管理集群,提供集群的资源数据的访问入口
(2)Node
node是k8s集群架构中运行pod的服务节点
(3)Pod
运行于Node节点上,若干相关容器的组合,pod内包含的容器运行在同一宿主机上,使用相同的网络命名空间,IP地址和端口,能够通过localhost进行通信

三:k8s的应用场景
k8s最适合跑微服务架构

四:搭建前的准备工作(所有服务器)
1.准备三台linux服务器,每台服务器配置2G内存和2CPU
角色 主机名 IP地址
Master master 192.168.175.3
Node node1 192.168.175.250
Node node2 192.168.175.251

2.安装vim
命令:yum -y install vim

3.更改hosts文件添加主机名与IP映射关系
命令:vim /etc/hosts
192.168.175.3 master
192.168.175.250 node1
192.168.175.251 node2

4.关闭防火墙和selinux
命令:iptables -F #清除防火墙规则
命令:systemctl stop firewalld #关闭防火墙
命令:setenforce 0 #关闭selinux

四:Kubernetes搭建
1.在各个节点上面安装k8s组件
配置master为etcd和master节点:
命令:[root@master ~]# yum install -y kubernetes etcd flannel ntp
命令:[root@node1 ~]# yum install -y kubernetes etcd flannel ntp
命令:[root@node2 ~]# yum install -y kubernetes etcd flannel ntp

2.(1)配置etcd
命令:[root@master ~]# vim /etc/etcd/etcd.conf #修改以下配置
ETCD_LISTEN_CLIENT_URLS=”http://localhost:2379,http://192.168.175.3:2379"
ETCD_NAME=”etcd”
ETCD_ADVERTISE_CLIENT_URLS=”http://192.168.175.3:2379"

(2)启动服务
命令:[root@master ~]# systemctl start etcd
命令:[root@master ~]# systemctl status etcd
命令:[root@master ~]# systemctl enable etcd

注意:etcd 通讯使用 2379 端口
(3)查看状态:
命令:[root@master ~]# ss -antulp | grep 2379

(4)检查 etcd 集群成员列表,这里只有一台
命令:[root@master ~]# etcdctl member list

3.配置master服务器
(1)配置master配置文件
命令:[root@master ~]# vim /etc/kubernetes/config #修改以下配置文件
KUBE_MASTER=”–master=http://192.168.175.3:8080"

(2)配置apiserver配置文件
命令:[root@master ~]# vim /etc/kubernetes/apiserver
KUBE_API_ADDRESS=”–insecure-bind-address=0.0.0.0”
KUBE_ETCD_SERVERS=”–etcd-servers=http://192.168.175.3:2379"
KUBE_ADMISSION_CONTROL=”–admission-control=AlwaysAdmit”

(3)配置 kube-scheduler 配置文件
命令:[root@master ~]# vim /etc/kubernetes/scheduler
KUBE_SCHEDULER_ARGS=”0.0.0.0”

4.(1) 配置 etcd,指定容器云中 docker 的 IP 网段
命令:[root@master ~]# etcdctl mkdir /k8s/network
命令:[root@master ~]# etcdctl set /k8s/network/config ‘{“Network”: “10.255.0.0/16”}’
命令:[root@master ~]# etcdctl get /k8s/network/config

(2)设置flanneld服务
命令:[root@master ~]# vim /etc/sysconfig/flanneld
FLANNEL_ETCD_ENDPOINTS=”http://192.168.175.3:2379"
FLANNEL_ETCD_PREFIX=”/k8s/network”
FLANNEL_OPTIONS=”–iface=ens33” #设置自己的通信物理网卡

命令:[root@master ~]# systemctl restart flanneld #重启服务

(3)检查所有配置
命令:[root@master ~]# cat /run/flannel/subnet.env
FLANNEL_NETWORK=10.255.0.0/16
FLANNEL_SUBNET=10.255.94.1/24
FLANNEL_MTU=1472
FLANNEL_IPMASQ=false

命令:[root@master ~]# cat /run/flannel/docker
DOCKER_OPT_BIP=”–bip=10.255.94.1/24”
DOCKER_OPT_IPMASQ=”–ip-masq=true”
DOCKER_OPT_MTU=”–mtu=1472”
DOCKER_NETWORK_OPTIONS=” –bip=10.255.94.1/24 –ip-masq=true –mtu=1472”

  1. 启动master上4个服务
    命令:[root@master ~]# systemctl restart kube-apiserver kube-controller-manager kube-scheduler flanneld
    命令:[root@master ~]# systemctl status kube-apiserver kube-controller-manager kube-scheduler flanneld
    命令:[root@master ~]# systemctl enable kube-apiserver kube-controller-manager kube-scheduler flanneld

  2. 配置minion节点服务器
    注意:minion各节点配置相同,这边已node1为例
    (1)配置flanneld服务
    命令:[root@node1 ~]# vim /etc/sysconfig/flanneld
    FLANNEL_ETCD_ENDPOINTS=”http://192.168.175.3:2379"
    FLANNEL_ETCD_PREFIX=”/k8s/network”
    FLANNEL_OPTIONS=”–iface=ens33”

(2)命令:[root@node1 ~]# vim /etc/kubernetes/config
KUBE_MASTER=”–master=http://192.168.175.3:8080"

(3)命令:[root@node1 ~]# vim /etc/kubernetes/kubelet
KUBELET_ADDRESS=”–address=0.0.0.0”
KUBELET_HOSTNAME=”–hostname-override=node1”
KUBELET_API_SERVER=”–api-servers=http://192.168.175.3:8080"
KUBELET_POD_INFRA_CONTAINER=”–pod-infra-container-image=registry.access.redhat.com/rhel7/pod-infrastructure:latest”

(4)启动node1服务
命令:[root@node1 ~]# systemctl restart flanneld kube-proxy kubelet docker
命令:[root@node1 ~]# systemctl enable flanneld kube-proxy kubelet docker
命令:[root@node1 ~]# systemctl status flanneld kube-proxy kubelet docker

7.查看服务是否安装成功(在master上查看)
命令:[root@master ~]# kubectl get nodes
NAME STATUS AGE
node1 Ready 2h
node2 Ready 25s

五:Kubernetes的web管理界面搭建

  1. 创建dashboard-deployment.yaml配置文件
    命令:[root@master ~]# vim /etc/kubernetes/dashboard-deployment.yaml
    apiVersion: extensions/v1beta1

kind: Deployment

metadata:

Keep the name in sync with image version and

gce/coreos/kube-manifests/addons/dashboard counterparts

name: kubernetes-dashboard-latest

namespace: kube-system

spec:

replicas: 1

template:

metadata:

  labels:

    k8s-app: kubernetes-dashboard

    version: latest

    kubernetes.io/cluster-service: "true"

spec:

  containers:

  - name: kubernetes-dashboard

    image: docker.io/bestwu/kubernetes-dashboard-amd64:v1.6.3

    imagePullPolicy: IfNotPresent

    resources:

      # keep request = limit to keep this container in guaranteed class
      limits:

        cpu: 100m

        memory: 50Mi

      requests:

        cpu: 100m

        memory: 50Mi

    ports:

    - containerPort: 9090

    args:

    - --apiserver-host=http://172.26.0.10:8080

    livenessProbe:

      httpGet:

        path: /

        port: 9090

      initialDelaySeconds: 30

      timeoutSeconds: 30

2.创建编辑 dashboard-service.yaml 文件:
命令:[root@master ~]# vim /etc/kubernetes/dashboard-service.yaml
apiVersion: v1

kind: Service

metadata:

name: kubernetes-dashboard

namespace: kube-system

labels:

k8s-app: kubernetes-dashboard

kubernetes.io/cluster-service: "true"

spec:

selector:

k8s-app: kubernetes-dashboard

ports:

  • port: 80

    targetPort: 9090

3.node1和node2需要提前拉取两个镜像
命令:[root@node1 ~]# docker search kubernetes-dashboard-amd
命令:[root@node1 ~]# docker pull docker.io/siriuszg/kubernetes-dashboard-amd64
命令:[root@node1 ~]# docker search pod-infrastructure
命令:[root@node1 ~]# docker pull docker.io/xiaotech/pod-infrastructure
命令:[root@node1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/siriuszg/kubernetes-dashboard-amd64 latest a8e05b8cb40d 3 months ago 122 MB
docker.io/xiaotech/pod-infrastructure latest 04ccf7b18fb5 16 months ago 209 MB
命令:[root@node2 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/siriuszg/kubernetes-dashboard-amd64 latest a8e05b8cb40d 3 months ago 122 MB
docker.io/xiaotech/pod-infrastructure latest 04ccf7b18fb5 16 months ago 209 MB

  1. 启劢 dashboard 的 deployment 和 service
    命令:[root@master ~]# kubectl create -f /etc/kubernetes/dashboard-deployment.yaml
    deployment “kubernetes-dashboard-latest” created

命令:[root@master ~]# kubectl create -f /etc/kubernetes/dashboard-service.yaml

5.查看运行结果
命令:[root@master ~]# kubectl get deployment –all-namespaces

命令:[root@master ~]# kubectl get svc –all-namespaces

16.单点登录(使用httpwebrequest_Post数据到网站)

怎样通过HttpWebRequest 发送 POST 请求到一个网页服务器?例如编写个程序实现自动用户登录,自动提交表单数据到网站等。
假如某个页面有个如下的表单(Form):

从表单可看到表单有两个表单域,一个是userid另一个是password,所以以POST形式提交的数据应该包含有这两项。
其中POST的数据格式为:
表单域名称1=值1&表单域名称2=值2&表单域名称3=值3……
要注意的是“值”必须是经过HTMLEncode的,即不能包含“<>=&”这些符号。

本例子要提交的数据应该是:
userid=value1&password=value2

用C#写提交程序:

string strId = “guest”;
string strPassword= “123456”;

ASCIIEncoding encoding=new ASCIIEncoding();
string postData=”userid=”+strId;
postData += (“&password=”+strPassword);

byte[] data = encoding.GetBytes(postData);

// Prepare web request…
HttpWebRequest myRequest =
(HttpWebRequest)WebRequest.Create(“http://www.here.com/login.asp");

myRequest.Method = “POST”;
myRequest.ContentType=”application/x-www-form-urlencoded”;
myRequest.ContentLength = data.Length;
Stream newStream=myRequest.GetRequestStream();

// Send the data.
newStream.Write(data,0,data.Length);
newStream.Close();

// Get response
HttpWebResponse myResponse=(HttpWebResponse)myRequest.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(),Encoding.Default);
string content = reader.ReadToEnd();
Console.WriteLine(content);

使用Visual Sniffer :

这里介绍个工具: Visual Sniffer , google 一下便可轻松找到下载地址。
可以使用 Visual Sniffer 来捕捉提交的数据信息:

  1. 访问你需要站外提交的页面,比如 CSDN 登陆页 http://www.csdn.net/member/UserLogin.aspx
  2. 填写好需要的资料,比如用户名和密码,
  3. 打开 Visual Sniffer, 点“开始拦截”
  4. 在访问的页面中提交。
  5. 等提交成功之后,在 Visual Sniffer 中“停止拦截”
  6. 在 Visual Sniffer 的左侧栏的加号中依次点开,右边是它拦截到的内容,
    找到 内容含有 POST http://www.csdn.net/member/UserLogin.aspx 的节点
    以下是我拦截的内容供参考:

POST http://www.csdn.net/member/UserLogin.aspx HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, /
Referer: http://www.csdn.net/member/UserLogin.aspx
Accept-Language: zh-cn
Content-Type: application/x-www-form-urlencoded
UA-CPU: x86
Pragma: no-cache
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; InfoPath.1)
Host: www.csdn.net
Content-Length: 355
Proxy-Connection: Keep-Alive
Cookie: ASPSESSIONIDAAAATBQC=FMEGGCKDBKHAMMCGKPFDMBFG; ASP.NET_SessionId=lusprmnom05lr445tmteaf55; userid=699879

EVENTTARGET=&EVENTARGUMENT=&__VIEWSTATE=dDwtMTcwMzgxNjQ2Mjs7bDxDU0ROVXNlckxvZ2luOmNiX1NhdmVTdGF0ZTtDU0ROVXNlckxvZ2luOkltYWdlX0xvZ2luOz4%2Btu1q2wmRZoAJTi9L73w1zBleylY%3D&CSDNUserLogin%3Atb_UserName=testusername&CSDNUserLogin%3Atb_Password=testpassword&CSDNUserLogin%3Atb_ExPwd=9232&from=&CSDNUserLogin%3AImage_Login.x=36&CSDNUserLogin%3AImage_Login.y=6
GET http://www.csdn.net/mycustompage.htm?aspxerrorpath=/member/UserLogin.aspx HTTP/1.0
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-shockwave-flash, /
Referer: http://www.csdn.net/member/UserLogin.aspx
Accept-Language: zh-cn
UA-CPU: x86
Pragma: no-cache
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; InfoPath.1)
Host: www.csdn.net
Proxy-Connection: Keep-Alive
Cookie: ASPSESSIONIDAAAATBQC=FMEGGCKDBKHAMMCGKPFDMBFG; ASP.NET_SessionId=lusprmnom05lr445tmteaf55; userid=699879

注意:PostData 参数之间是以 “ & “ 进行 连接的

OK,通过以上简单示例,只要稍微修改下,即可做成多站点自动登陆,或自动网上投票等功能!

such as:

代码如下:

ASCIIEncoding encoding=new ASCIIEncoding();
string postData="TextBox1=33&Button1=Button";
byte[]  data = encoding.GetBytes(postData);

// Prepare web request
HttpWebRequest myRequest =
    (HttpWebRequest)WebRequest.Create("http://localhost/testform1.aspx");
myRequest.Method = "POST";
myRequest.ContentType="application/x-www-form-urlencoded";
myRequest.ContentLength = data.Length;
Stream newStream=myRequest.GetRequestStream();
// Send the data.
newStream.Write(data,0,data.Length);
newStream.Close();

解释:
postData 为你要提交的数据
比如 CSDN 的登录页面 http://www.csdn.net/member/UserLogin.aspx
输入用户名密码和校验码,并提交之后,浏览器便将下面的数据提交到服务器:

CSDNUserLogin%3Atb_UserName=yourName&CSDNUserLogin%3Atb_Password=yourPassword&CSDNUserLogin%3Atb_ExPwd=2332

其中的 yourName 为你实际登陆时提交的用户名, yourPassword 即为你的密码, 2332 是我刚才登陆时的验证码

参考网址:

http://dev.csdn.net/article/28/28374.shtm
http://www.knowsky.com/18774.html
http://www.netomatix.com/HttpPostData.aspx

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1600137


:D 一言句子获取中...