11 พฤษภาคม 2562

ไปเที่ยว ซื้อของ อย่าลืมขอบิลกับ 6 มาตรการลดหย่อนภาษีใหม่


แม่ตาเดียว

แม่ขายของที่ตลาด ผมหลบเลี่ยงที่จะเดินไปแถวนั้น

วันหนึ่งวันกีฬาสี แม่มาหาผมที่โรงเรียน ผมวิ่งหลบหนีแม่ เพราะเพื่อนล้อเลียนว่า “ไอ้ลูกแม่ตาเดียว” ผมเกลียดคำนี้

คืนหนึ่งผมลงมาทานน้ำ เห็นแม่ร้องไห้ ผมหลบเลี่ยงที่จะเห็นน้ำตาแม่ ผมเกลียดที่จะอยู่กับแม่ตาเดียว ผมอยากรวยจึงเรียนหนัก ผมเริ่มมีครอบครัวที่มั่งคงและมีลูกน่ารัก แต่..ผมลืมและทิ้งแม่ตาเดียว

วันหนึ่งมีผู้หญิงน่าเกลียดมาที่บ้านผม ลูกๆ พากันรังเกียจ ผมได้ตวาดแม่ว่า…
“มาทำให้ลูกผมตกใจทำไม?” เพราะผมบอกลูกเมียว่าแม่ตายไปแล้ว

วันหนี่งผมไปงานเลี้ยงรุ่นใกล้บ้านเดิม จึงแวะไปที่อยู่เก่าเพื่อเอาของบางอย่าง
ที่นั่น ที่แม่ได้ตายไป ผมยืนมอง แต่ไม่มีน้ำตาของผมแม้แต่น้อย

มีกระดาษข้างรูปวางไว้ เขียนว่า….

แม่จะไม่ไปหาลูกอีก
เพราะทำให้ลูกลำบากใจ
ลูกรู้ไหมตอนลูกเป็นเด็กเล็ก
ลูกคลอดออกมาด้วยตาข้างเดียว

แ ล ะ นั่ น คื อ… ด ว ง ต า ข อ ง แ ม่ ใ น ลู ก

แม่ดีใจที่เห็นลูกได้เห็นโลกที่สวยงาม

แ ล ะ มี ชี วิ ต ที่ ดี แ ล ะ มี ค ว า ม สุ ข ”

น้ำตาผมหลั่งออกมาโดยไม่รู้ตัว แ ม่…. ไ ม่ ไ ด้ พิ ก า ร

ค น ที่ พิ ก า ร คือ ตั ว ผ ม

ช า ย หั ว ใ จ พิ ก า ร ใ น ค ว า ม เ ป็ น ลู ก ข อ ง แ ม่

ลูกผมไม่มีโอกาสได้ยินกระทั่งเสียงแม่ตาเดียวของผม

นี่คือเรื่องเล่าขานที่มีชื่อเสียงเรื่องหนึ่งในเกาหลี.

รักของแม่ คือ รักแท้ที่ไม่อาจคำนวณได้

รักของแม่ให้อย่างไม่มีเงื่อนไข และเสียสละให้ผู้อื่นได้เหมือนแม่ผม

ขอให้ลูกทุกคนบนโลกนี้ จงดูแลแม่ขณะที่แม่ยังมีลมหายใจอยู่

อย่าใจบอดหลงผิดเหมือนผมเลย!!



from fwd email

09 พฤษภาคม 2562

(SCBDIGI) Pictet-Digital portfolio as at September 30, 2018

Sort by country

-->
Name Country Percent
BAIDU 'A' ADR -SPONS.-
Cayman Islands
2.45
CTRIP.COM INTERNATIONAL ADR -SPONS.- Cayman Islands 0.98
NETEASE ADR -SPONS.- Cayman Islands 3.87
SINA Cayman Islands 1.2
TENCENT HOLDINGS Cayman Islands 3.28
ALIBABA GROUP HOLDING ADR -SPONS.- China 3.18
VIPSHOP HOLDINGS ADR -SPONS.- China 0.83
CRITEO ADR -SPONS.- France 0.89
ILIAD France 0.51
CHINA MOBILE Hong Kong 1.86
BHARTI AIRTEL -DEMAT.- India 0.51
TELEKOMUNIKASI INDONESIA 'B' Indonesia 0.62
PADDY POWER BETFAIR Ireland 0.41
NINTENDO Japan 2.19
NIPPON TELEGRAPH & TELEPHONE Japan 0.91
NTT DOCOMO Japan 0.6
RAKUTEN Japan 1.51
SOFTBANK GROUP Japan 0.37
YAHOO JAPAN Japan 0.52
WOLTERS KLUWER Netherlands 1.09
NASPERS 'N' South Africa 2.48
NAVER South Korea 2.39
SAMSUNG ELECTRONICS South Korea 3.5
BT GROUP United Kingdom 1.16
VODAFONE GROUP United Kingdom 1.74
ALPHABET 'A' United States 3.49
AMAZON.COM United States 3.33
APPLE United States 3.68
AT&T United States 2.79
BOOKING HOLDINGS United States 2.63
COMCAST 'A' United States 3.53
EBAY United States 2.8
ELECTRONIC ARTS United States 1.68
EVOLENT HEALTH 'A' United States 0.63
EXPEDIA United States 2.28
FACEBOOK 'A' United States 3.29
GROUPON United States 0.82
IAC/INTERACTIVECORP United States 1.94
IMPERVA United States 0.69
INTUIT United States 3.24
MEDIDATA SOLUTIONS United States 1.08
MERCADOLIBRE United States 1.31
MICROSOFT
United States 3.64
NETFLIX United States 1.09
PAYPAL HOLDINGS United States 3.48
SALESFORCE.COM United States 3.77
TRIPADVISOR United States 0.52
TWITTER United States 1.86
ULTIMATE SOFTWARE GROUP United States 0.93
VERIZON COMMUNICATIONS United States 2.02
YELP United States 0.45
ZENDESK United States 0.74
ZYNGA A United States 0.79



Sort by percent

-->
Name Country Percent
NETEASE ADR -SPONS.- Cayman Islands 3.87
SALESFORCE.COM United States 3.77
APPLE United States 3.68
MICROSOFT
United States 3.64
COMCAST 'A' United States 3.53
SAMSUNG ELECTRONICS South Korea 3.5
ALPHABET 'A' United States 3.49
PAYPAL HOLDINGS United States 3.48
AMAZON.COM United States 3.33
FACEBOOK 'A' United States 3.29
TENCENT HOLDINGS Cayman Islands 3.28
INTUIT United States 3.24
ALIBABA GROUP HOLDING ADR -SPONS.- China 3.18
EBAY United States 2.8
AT&T United States 2.79
BOOKING HOLDINGS United States 2.63
NASPERS 'N' South Africa 2.48
BAIDU 'A' ADR -SPONS.-
Cayman Islands
2.45
NAVER South Korea 2.39
EXPEDIA United States 2.28
NINTENDO Japan 2.19
VERIZON COMMUNICATIONS United States 2.02
IAC/INTERACTIVECORP United States 1.94
CHINA MOBILE Hong Kong 1.86
TWITTER United States 1.86
VODAFONE GROUP United Kingdom 1.74
ELECTRONIC ARTS United States 1.68
RAKUTEN Japan 1.51
MERCADOLIBRE United States 1.31
SINA Cayman Islands 1.2
BT GROUP United Kingdom 1.16
WOLTERS KLUWER Netherlands 1.09
NETFLIX United States 1.09
MEDIDATA SOLUTIONS United States 1.08
CTRIP.COM INTERNATIONAL ADR -SPONS.- Cayman Islands 0.98
ULTIMATE SOFTWARE GROUP United States 0.93
NIPPON TELEGRAPH & TELEPHONE Japan 0.91
CRITEO ADR -SPONS.- France 0.89
VIPSHOP HOLDINGS ADR -SPONS.- China 0.83
GROUPON United States 0.82
ZYNGA A United States 0.79
ZENDESK United States 0.74
IMPERVA United States 0.69
EVOLENT HEALTH 'A' United States 0.63
TELEKOMUNIKASI INDONESIA 'B' Indonesia 0.62
NTT DOCOMO Japan 0.6
YAHOO JAPAN Japan 0.52
TRIPADVISOR United States 0.52
ILIAD France 0.51
BHARTI AIRTEL -DEMAT.- India 0.51
YELP United States 0.45
PADDY POWER BETFAIR Ireland 0.41
SOFTBANK GROUP Japan 0.37


from http://www.morningstar.co.uk/uk/funds/snapshot/snapshot.aspx?id=F0GBR04BCL

01 พฤษภาคม 2562

Architecture micro services APIs back-end for web application

ผมได้มีโอกาส research หาข้อมูลการออกแบบ Architecture ของ micro services APIs back-end for web application โดยเน้นที่ Securityเป็นหลัก เลยอยากเอามาแชร์ในบลอกนี้

(Architecture อาจจะค่อนข้างซับซ้อน และยุ่งยากนิดหน่อย ในการพัฒนาครับ)


จากรูปด้านบน เราจะแบ่ง user token ของเป็น 2 zone คือ byReference token และ byValue token

โดย concept หลักๆ คือ byReference token จะเป็นแค่ค่า unique ที่ไม่มีเนื้อหาของ accessToken ส่วน byValue token จะเก็บ accessToken

ตัว APIs gateway จะทำหน้าที่ mapping byReference token และ byValue token

user services จะเป็นตัว authenticate user และสร้าง access token ดังนั้น user services จะเก็บ private key

services อื่นๆ จะทำหน้าที่ verify access token ดังนั้นต้องเก็บ public key







จากรูปด้านบน จะเป็นตัวอย่าง flow ของการ login เข้าสู่ระบบ ซึ่งจะมีขั้นตอนดังนี้

1. กรอก username, password

2. nginx forward request to APIs gateway

3. APIs gateway forward request to user services

4. user services authenticate username, password กับ database

5. user services สร้าง access token

6. user services return access token / userId to APIs gateway

7. APIs gateway ตรวจสอบว่ามี token ใน redis ของ user แล้วหรือยัง (กรณี login มาจากหลายๆ session) ถ้ามี ให้ลบทิ้ง (เตะ session เก่าๆ)

8. APIs gateway สร้าง byReference token และ byValue token 

9. APIs gateway set cookie header of client โดยตามหลัก security จะต้องทำการ set properties ดังต่อไปนี้
- secure cookie: true => cookie จะทำงานบน https เท่านั้น
- httponly: true => ไม่ให้ javascript เข้าถึง cookie ได้
- samesite cookie => ป้องกันการ hack จาก domain อื่นๆ

10. APIs gateway forward response to nginx








จากรูปด้านบน จะเป็นตัวอย่าง flow ของการ consume resource APIs  ซึ่งจะมีขั้นตอนดังนี้

1. client call resource APIs (e.g., ds)

2. APIs gateway get userId from byReference token

3. APIs gateway get access token from byValue token

4. APIs gateway forward request to resource APIs

5. resouce APIs validate access token using public key





จากรูปด้านบน จะเป็นตัวอย่าง flow ของการ logout ซึ่งจะมีขั้นตอนดังนี้

1. client call logout API

2. APIs gateway delete token from redis


19 เมษายน 2562

คนญี่ปุ่นชี้ ความแตกต่างระหว่าง "มนุษย์ที่จะเติบโตในหน้าที่การงาน" VS "คนที่ไม่ได้ไปต่อ "

ความเครียดจากการทำงานนั้น ใครๆ ก็ต้องเคยเจอ แต่จะมีปฏิกิริยาหรือรองรับกับสถานการณ์ที่เจออย่างไรนั้นขึ้นอยู่กับบุคคลแต่ละคน

จากนี้จะนำเสนอความแตกต่างระหว่างคนที่จะเติบโตในหน้าที่การงาน และคนที่ไม่ใช่ คือไม่สามารถประสบความสำเร็จในหน้าที่การงานได้



01. คนที่มีความอยากรู้อยากเห็น/คนที่มีความเฉยเมยไม่มีความอยากรู้

มนุษย์ที่จะเติบโตในหน้าที่การงาน อย่างหนึ่งควรมีความใฝ่รู้ มีความกระตือรือร้นในการเรียนรู้สิ่งใหม่ๆ ซึ่งความอยากรู้อยากเห็นนี้ ก็มีข้อดีในตัวของมันเองเช่นกัน

ความใฝ่รู้ มีความกระตือรือร้นทำให้มนุษย์เรามีความรู้ สามารถนำไปสร้างสรรค์นวัตกรรม ได้ใช้จินตนาการและความคิดสร้างสรรค์ในการคิดค้นสิ่งประดิษฐ์ใหม่ๆ ทำให้โลกเกิดวิวัฒนาการ และพัฒนา พฤติกรรมที่อยากรู้อยากเห็น ทำให้เกิดการสำรวจ การสืบเสาะ และการเรียนรู้เป็นแรงจูงใจของการศึกษาของมนุษย์ พนักงานที่มีความใฝ่รู้และอยากรู้อยากเห็นจึงมีแนวโน้มที่จะพัฒนาและต่อยอดสิ่งต่างๆ ได้อย่างมีความคิดสร้างสรรค์ ซึ่งตรงข้ามกับผู้ที่หมดอาลัยตายอยาก ไม่คิดอยากเดินทางไปทำงาน ไม่มีแรงจูงใจใดๆ และรู้สึกเบื่อ เซ็ง กับงานที่ทำอยู่ในที่สุด ทำให้มีรูปแบบการทำงานแบบเช้าชามเย็นชามไปวัน ๆ



02. คนที่เรียนรู้จากความผิดพลาด/ คนที่กลัวความผิดพลาดล้มเหลว

คนที่เรียนรู้จากความผิดพลาดเป็นคนที่หน้าเอาเป็นตัวอย่าง แม้ว่าจะล้มเหลวมาบ้างก็เป็นเรื่องธรรมดา ที่ทุกคนต้องเจอเพียงแต่ต้องเรียนรู้วิธีที่จะไม่ทำให้เราผิดพลาดซ้ำเดิมอีก และนำประสบการณ์นั้นมาปรับปรุงประยุกต์ใช้ต่อไป และถ้าเราทำได้เราจะเก่งและแกร่งขึ้นสามารถยืนได้ด้วยตนเอง และใช้บทเรียนนั้นมาสอนตัวเองและคนอื่นๆ อาจจะเป็นเพื่อนหรือลูกน้องในบังคับบัญชาของตนเอง ก็จะทำให้องค์กรพัฒนาต่อไปได้ แม้ว่าความผิดพลาดจะนำความเสียใจและความผิดหวังมาสู่เรา แต่เราต้องไม่ท้อถอยและต้องพยายามหาทางก้าวข้ามความผิดหวังเหล่านั้นให้ได้ และเราจะรู้คุณค่าของมัน

ตรงข้ามกับคนที่กลัวความผิดพลาดล้มเหลวจะไม่ยอมแม้แต่ก้าวเดินออกมาจากกรอบที่ตัวเองขีดกั้นไว้ ทำให้มองไม่เห็นโอกาสและแนวทางดีๆ ของชีวิต ไม่สามารถก้าวต่อไปข้างหน้าได้ สิ่งใดๆ ที่เกิดขึ้นแล้วนั้น สิ่งนั้นย่อมดีเสมอ เราต้องมีสติและเก็บเกี่ยวทุกประสบการณ์มาเป็นบทเรียน เพื่อช่วยเสริมสร้างแนวคิดและจิตใจให้เข้มแข็งแก่ตัวเองต่อไปได้ในอนาคต



03. คนที่รับฟังฝ่ายตรงข้ามก่อนจะตัดสินใจ / คนที่ไม่ฟังความคิดเห็นผู้ใด

การฟังคือทักษะที่จำเป็นอีกอย่างหนึ่ง ที่จะช่วยให้คนเราประสบความสำเร็จ เพราะตามพื้นฐานทั่วไปใครๆ ก็ต้องการความเข้าใจ ดังนั้นเราควรใส่ใจและหยุดสักนิดเพื่อรับฟังฝ่ายตรงข้าม พยายามเข้าใจมุมมองของอีกฝ่าย และถ้าตั้งใจฟังอย่างดี ก็จะทำให้การตอบสนองเป็นไปได้อย่างมีประสิทธิภาพมากขึ้น ช่วยให้งานบรรลุจุดประสงค์ได้เร็วขึ้นและตรงประเด็น

นอกจากการรับฟังความเห็นแล้ว การรับฟังคำวิจารณ์ก็เป็นสิ่งจำเป็นเช่นกัน เช่นข้อร้องขอหรือข้อร้องเรียนจากลูกค้า นับว่าเป็นทักษะที่สำคัญอีกอย่างหนึ่งของงานขายหรืองานบริการ การตลาดต่างๆ ดังนี้บุคคลที่เริ่มต้นจากการทำความเข้าใจความต้องการของฝ่ายตรงข้าม จะทำให้สามารถนำเอาสินค้าและบริการไปใช้ตอบสนองความจำเป็นหรือใช้แก้ปัญหาของลูกค้าที่ใช้บริการสินค้าเราได้ นอกจากนี้การรับฟังและเข้าใจลูกค้าจะทำให้เราสามารถสื่อสารได้ตรงจุดประสงค์ และสามารถนำเอาสินค้าและบริการไปตอบสนองความต้องการได้ตรงใจของลูกค้าทำให้ยอดขายดีขึ้น นำกำไรและความรุ่งเรืองมาสู่บริษัทในที่สุด ตรงข้ามกับคนที่คนที่ไม่ฟังความคิดเห็นผู้ใด คนที่เอาตัวเองเป็นศูนย์กลาง ถ้าตนเองทำผิดเองก็อาจจะโทษคนอื่น ไม่ยอมรับผิด ไม่เคยคิดว่า ตัวเองคิดผิด ทำให้องค์กรถดถอยเป็นอย่างมาก



04. คนที่ไม่หนีงาน / คนที่มักจะเลี่ยงงาน

คนที่ไม่หนีงานแตกต่างจากคนที่ มักจะหลบเลี่ยงงานหรือคนที่ทัศนคติลบต่อการทำงานเป็นอย่างมาก เพราะมีความตรงข้ามกันโดยสิ้นเชิง เพราะคนที่ไม่หนีงานจะรู้จักการจัดลำดับความสำคัญของงานของตนเอง รู้จักการประเมินงานตามความสำคัญและไม่สำคัญ เป็นงานที่เร่งด่วนหรือไม่เร่งด่วน เพราะว่างานทั่วไปแล้วย่อมมีกำหนดระยะเวลา มีการตรวจสอบเอกสาร มีการจัดทำเอกสารรายงาน การประชุมต่างๆ มากมาย

เขาจะสามารถรับมือกับงานได้อย่างมีประสิทธิภาพและได้ผลลัพธ์ที่ดี และถ้ารู้ว่างานใดไม่สำคัญมากก็จะให้ทีมงานคนอื่นๆ ทำ

ตรงข้ามกับคนที่มักจะเลี่ยงงาน มักจะหาข้ออ้างนู้นนี่มากมาย งานยากเกินไป ทำไม่ทันบ้าง มีปัญหามากมาย ไม่ลองสร้างความท้าทายให้เส้นทางชีวิตการงานตนเอง แก้ปัญหาไม่เป็น แถมยังไม่ยอมปรึกษาใคร เช่นนี้เป็นผลเสียหายต่อองค์กรอย่างมาก



05.คนที่ไม่ล้มเลิกความพยายามไม่ว่าจะเรื่องงานหรือเรื่องตนเอง/ คนที่ท้อถอย ล้มเลิกความพยายามง่ายๆ

องค์ประกอบของบุคคลที่มักจะประสบความสำเร็จอีกอย่างหนึ่งคือ คนที่ไม่ล้มเลิกความพยายามไม่ว่าจะเรื่องงานหรือเรื่องตนเอง มีความเชื่อมั่นในตัวเอง และมักจะเป็นคนมีเหตุผล มีวิสัยทัศน์กว้างไกลและมีจิตใจที่มั่นคง แค่นี้ก็เพียงพอแล้วกับบุคคลที่องค์กรต้องการ ในไม่ช้าย่อมประสบความสำเร็จอย่างแน่นอน

การลงมือทำงานหรือสิ่งใดๆ อย่างมุ่งมั่น มีความพยายามนั้น จะต้องทำเพื่อให้บรรลุเป้าหมายอย่างจริงจัง เขาจะตั้งคำถามว่า เขาต้องทำอะไรบ้างที่จำเป็นต่อความสำเร็จ และจะเพียรพยายามทำสิ่งเหล่านั้นให้ได้ โดยความกล้าหาญ และมักจะเป็นคนที่คิดบวกอยู่เสมอ ไม่นำความคิดแง่ลบมาทำลายความพยายามของตัวเอง จนกว่าจะประสบผลสำเร็จ

ตรงข้ามกับคนที่ท้อถอย ล้มเลิกความพยายามง่ายๆ มักจะล้มเลิกกลางคัน ไม่เชื่อมั่นในตนเอง และไม่มีเป้าหมายในชีวิต ย่อมเดินไปอย่างไร้เข็มทิศและยากที่จะประสบความสำเร็จได้



ที่มา https://mgronline.com/japan/detail/9620000030463

04 เมษายน 2562

create a privacy policy for android/ios mobile application

steps create a privacy policy for android/ios mobile application


  1. create privacy policy online at => https://app-privacy-policy-generator.firebaseapp.com
  2. export privacy policy to HTML
  3. public HTML file to the internet and get the URL using => https://sites.google.com

22 มีนาคม 2562

kubenates training note (21-22 Mar 2019)

related repositories
https://github.com/up1/course-kubernetes-in-practice
https://github.com/up1/workshop-kubernetes-microservices

========================= day1=========================
gcloud sdk => https://cloud.google.com/sdk/docs/quickstart-macos

slide => https://github.com/up1/course-kubernetes-in-practice

cloud native landspace => https://landscape.cncf.io/

container design principal
- image immutible: 1 image run anywhere

- high observability principle
  -- health
    --- readiness: workable (can connect db, redis, external)
    --- liveness: call, get 200 (but don't know workable or not)

  -- metrics
    --- tracing
    --- logging

- single responsibility
  -- 1 container -> 1 process

- support graceful shutdown
  -- handle sigterm

- self containment principle
  -- no configuratin in container
  -- no storage is related to container (change disk, not affect app)

kubernetes world is a service layer, everything is a service

standard k8s
- 4 machines
- design to run eveywhere
- master & slaves
- เวลาเรา manage, manage ผ่าน master
- เวลาใช้งาน เข้า slaves ตรงๆ ไม่ผ่าน master

$ kubectl get nodes // get nodes

k8s master components
- API server => mapping, updating etds, access etcd, authen, authorize
- scheduler => เลือกว่าจะดีพลอยเครื่องไหน, resource utilization
- controller => maintain number of pods (up or down)
- etcd => discovery


k8s slaves (node) components:
- kubelet: get command from master, จงสร้างแอพ 1, เป็น agent
- docker
- kube-proxy: รับ request จากภายนอก(คนใช้งาน), เก็บ iptables
- fluend

tracing
tool: jeager, istio

workshop 01-hello
$ kubectl run hello --image=somkiat/hello:latest --port=8080 --generator=run/v1
--generator=run/v1 => คือให้มันสร้าง replicationcontroller ให้
replicationcontroller/hello created

pod คือ หน่วยที่เล็กที่สุด
scaling => scale ระดับ pod
ใน pod มีได้หลาย container แต่ควรมีแค่ container เดียว

$ kubectl get pod // get pods
$ kubectl describe pod/hello-6ln72 // get pod details

2 containers ถ้าอยู่ใน pod เดียวกัน คุยผ่าน localhost ได้

$ kubectl get pod/hello-6ln72 -o json // get json format, or -o yaml

$ kubectl get rc // get replicationcontroller or "kubectl get replicationcontroller"

$ kubectl scale rc hello --replicas=3 // scale to 3

$ kubectl get pod -w // watching

$ kubectl delete pod/hello-6ln72 // delete pod

* replicationcontroller ปัจจุบันไม่ได้ใช้แล้วนะ

$ kubectl get pod -o wide // ดูว่าแต่ละ pod รันบนเครื่องไหน

$ kubectl get pod,rc // view pod & rc

$ kubectl delete rc/hello // delete rc

$ kubectl --namespace=kube-system get pod // ดู pod system

logging (เป็น udp มีโอกาสหาย สำหรับ application log)
1. app log to syslog server
2. fluend set source to syslog (monitor syslog)
audit log ห้ามหาย ห้ามใช้

ของ gcp, fluend จะอ่าน log แล้วโยนเข้า stack driver ให้

เราจะไม่ expose pod, expose ผ่าน service layer เอา

$ kubectl get service // or "kubectl get svc", can see clusterIP

3 types of services
1. clusterIP:
  - private
  - clusterIP is ip of the service
2. node port
3. load balance
  - default => dynamic ip
  - static ip => pay money
  - access LB ที่เดียว
4. ingress controller (built-in k8s)
  - map /a => go to service A
  - map /b => go to service B

$ kubectl expose rc hello --type=LoadBalancer --name hello-http // expose LB
$ kubectl get svc -w
$ kubectl get svc/hello-http -o yaml

workshop 02 - single pod

selector เดียวกันคือ cluster เดียวกัน

$ kubectl get all

$ kubectl delete all --all

1. cd /Users/apple/Desktop/myProjects/k8s-training/course-kubernetes-in-practice/workshop/02-pod-service/single-pod
2. kubectl create -f .
    or kubectl create -f https://xxxxx.yaml
    or kubectl create -f pod.yaml
3. kubectl delete -f . // delete all

allow firewall on gcpcloud
$ gcloud compute firewall-rules create xxx123 --allow tcp:32346

$ kubectl get node -o wide // node is machine

replicaSet
- we don't use replicationcontroller anymore, use replicaSet (rs)

view all resources => kubectl api-resources

deployment stretagy
- re-create
- ramp -> default k8s
- blue green
- ab
- canary
- shadow

$ kubectl describe po/hello-5bbb55ffb-cg7kk // can see namespace of this pod
$ kubectl get ns // get name space

service expose pod (in selector -> selector pod)
deployment -> replicaSet -> pod

$ kubectl get deploy // get deployment

owasp
- web
- mobile
- docker

slide: SCK-DOCKER-KUBERNETES-IN-PRACTICE.pdf

config map: reference configuration
secret: xxxxx (config ที่เป็นความลับ, e.g., password)
super secret should use 3rd party, e.g., vault

kompose -> convert docker-compose to k8s (https://github.com/kubernetes/kompose)





========================= day2=========================
monitor docker
- cAdvisor: monitor docker (https://github.com/google/cadvisor)
- prometheus:
  -- set docker daemon json to point to prometheus server
  -- enable localhost:1337
  -- advance=> {
    "metrics-addr": "0.0.0.0:1337",
    "experimental: true,
    "debug": true
  }
  -- http://localhost:1337/metrics

$ docker system events // watch docker event


hpa (horizontal pod autoscaler)
hpa
- auto scale based on cpu by default, we can auto scale by custom matric
- มันจะค่อยๆ สเกล  ถ้าทราฟฟิคพีคสูงมากๆ ไมเวิร์ต ต้อง manual scale

components in autoscaling
- cAdvisor (in kubelet) will monitor pod data
- heapster (metrics-server for new version) collect metrics from cAdvisors
- hpa will get metrics from heapster
- hpa work with deployment, will increase or decrease number of replicas

heapster is deprecated (use metrics-server instead)

metrics-server: need to install by ourselves for on-premise case


$kubectl create -f https://raw.githubusercontent.com/up1/course-kubernetes-in-practice/master/working-with-java/02-web-app/k8s/mongodb/mongo-controller.yaml
$kubectl create -f https://raw.githubusercontent.com/up1/course-kubernetes-in-practice/master/working-with-java/02-web-app/k8s/mongodb/mongo-service.yaml

$kubectl create -f https://raw.githubusercontent.com/up1/course-kubernetes-in-practice/master/working-with-java/03-hpa/boot-deployment.yaml
$kubectl create -f https://raw.githubusercontent.com/up1/course-kubernetes-in-practice/master/working-with-java/03-hpa/boot-service.yaml

$ gcloud compute firewall-rules create xxx124 --allow tcp:32500 // open firewall
$ kubectl get node -o wide // get external ip of machine
$ curl http://35.224.26.179:32500/user

$kubectl autoscale deployment/spring-boot-service-deployment --min=1 --max=5 --cpu-percent=5
$kubectl get hpa
$kubectl describe hpa

secret and configuration management
$ kubectl get configmap
$ kubectl get secret

configmap 2 modes
- env -> need to re-deploy deployment
- volumn -> don't need to re-deploy deployment

$ spring-boot-service-deployment-567f8d58bc-lc85k // exec pod

$ kubectl apply -f config.yaml // apply config map after updating
$ kubectl apply -f . // apply configuration change

stateful with k8s

sample: https://codelabs.developers.google.com/codelabs/cloud-mongodb-statefulset/index.html#0

stateful with k8s
- volumn
- statefulset

volumes
- EmptyDir:
  -- เหมือน tmp ข้อมูลจะออโต้ลบเอง
  -- e.g., log
  -- 1 pod 2 containers: main & fluentd (shift log)
- hostPath
- gitRepo
- NFS
- icePersistentDisk
- flocker: cloud storage
- Persistent Volume Claim (PVC)

storage class:
- dynamic claim
- class, e.g., gold, platinum

Persistent Volume:
- static claim: ต้องบอกว่าจะเคลมกี่ G
- cannot bind 2 pvc to the same pv

$ cd workshop/05-volume/persistent_volume

$ kubectl get pv -w // get pv
$ kubectl get pvc -w  // get pvc
$ kubectl get po,pv,pvc


http://www.somkiat.cc/hello-cotton-for-api-testing/ // automate test

workshop >> https://github.com/up1/workshop-kubernetes-microservices

online play docker >> https://labs.play-with-docker.com/


port
- nodeport: port of nodeport
- port: port of service
- targetPort: port of pod